/ Hex Artifact Content
Login

Artifact 332af8613687d1fcf89ff072c2dfecda74b260a54f850230fc82d6757a3a4904:


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 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9140: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
9150: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9160: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9170: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
9180: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
9190: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
91a0: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
91b0: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
91c0: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
91d0: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
91e0: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
91f0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
9200: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9210: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
9220: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9230: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9240: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9250: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9260: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9270: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9280: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
9290: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
92a0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
92b0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
92c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92d0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92e0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
92f0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
9300: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9310: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
9320: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9330: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9340: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9350: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9370: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9380: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9390: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
93a0: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
93b0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
93c0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93d0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93e0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
93f0: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
9400: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
9410: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9420: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9430: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9440: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9450: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9460: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9470: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9480: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9490: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
94a0: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
94b0: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
94c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94d0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
94f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9500: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9510: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
9520: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9530: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9540: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
9550: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
9560: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
9570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9580: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9590: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
95a0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
95b0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
95c0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
95d0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
95e0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
95f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9600: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
9610: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
9620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
9640: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
9650: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
9660: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
9670: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9680: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9690: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
96a0: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
96b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
96c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
96d0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
96e0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
96f0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
9700: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
9710: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
9720: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
9730: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
9740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
9750: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
9760: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
9770: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9780: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9790: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
97a0: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
97b0: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
97c0: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
97d0: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
97e0: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9810: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
9820: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9830: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9840: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9850: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
9860: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
9870: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9890: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
98a0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
98b0: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
98c0: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
98d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
98e0: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
98f0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
9900: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
9910: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
9920: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9930: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9940: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9950: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9960: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9970: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9980: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9990: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
99a0: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
99b0: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
99c0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
99d0: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
99e0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
99f0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
9a00: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
9a10: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
9a20: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9a30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9a40: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9a50: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
9a60: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
9a70: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9a80: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9a90: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9aa0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9ab0: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9ac0: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9ae0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9af0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9b00: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9b10: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
9b20: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9b30: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9b40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b50: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
9b60: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
9b70: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b80: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9b90: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9ba0: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9bb0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9bc0: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9bd0: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9be0: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9bf0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9c00: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9c10: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
9c20: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9c30: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9c40: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9c50: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
9c60: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
9c70: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9c80: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9c90: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9ca0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9cb0: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9cf0: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9d00: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9d10: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
9d20: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9d30: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9d40: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9d50: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
9d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9d70: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9d80: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9d90: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9da0: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9db0: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9dc0: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9dd0: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9de0: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9df0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9e00: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9e10: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
9e20: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9e30: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9e40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9e50: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
9e60: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9e70: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9e80: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9e90: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9ea0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9eb0: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9ec0: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9ed0: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9ee0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ef0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9f00: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9f10: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9f20: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9f30: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9f40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9f50: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9f60: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9f70: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9f80: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9f90: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9fa0: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9fb0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9fc0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9fe0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9ff0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
a000: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a010: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
a020: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
a030: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
a040: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
a050: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
a060: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a070: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
a080: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a090: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
a0a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a0b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a0c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
a0d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0e0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
a0f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a100: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
a110: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
a120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
a130: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
a140: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
a150: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
a160: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
a170: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
a180: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
a190: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
a1a0: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
a1b0: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
a1c0: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
a1d0: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
a1e0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
a1f0: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
a200: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
a210: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
a220: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
a230: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
a240: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
a250: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
a260: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
a270: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
a280: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
a290: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
a2a0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
a2b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a2c0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
a2d0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
a2e0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
a2f0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
a300: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
a310: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
a320: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
a330: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
a340: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
a350: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
a360: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a370: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
a380: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
a390: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
a3a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
a3b0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
a3c0: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
a3d0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
a3e0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
a3f0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
a400: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
a410: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
a420: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
a430: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a440: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a450: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
a460: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
a470: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a480: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a490: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a4a0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a4b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a4c0: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a4d0: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a4e0: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a4f0: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a510: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a520: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a530: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a540: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a550: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a560: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a570: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a580: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a590: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a5a0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a5b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a5c0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a5d0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a5e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5f0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a600: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a610: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a620: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a630: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a640: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a660: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a670: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a680: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a690: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a6a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a6c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a6d0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a6e0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6f0: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a700: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a710: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a720: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a730: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a740: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a750: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a760: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a770: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a780: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a790: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a7a0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a7b0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a7c0: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a7d0: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a7e0: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a800: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a810: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a820: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a830: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a840: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a850: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a860: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a870: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a880: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a890: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a8a0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a8b0: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a8c0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a8d0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a8e0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a8f0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a900: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a910: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a920: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a930: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a940: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a950: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a960: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a970: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a980: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a990: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a9a0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a9b0: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a9c0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9d0: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a9e0: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a9f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
aa00: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
aa30: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
aa40: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
aa50: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
aa60: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
aa70: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
aa80: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
aa90: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
aaa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aab0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
aac0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
aad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
aae0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
aaf0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
ab00: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
ab10: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
ab30: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
ab40: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
ab50: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab60: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
ab70: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
ab80: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
ab90: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
aba0: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
abb0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
abc0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
abd0: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
abe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
abf0: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
ac00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac10: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
ac20: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
ac30: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac40: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
ac50: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
ac60: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
ac70: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ac80: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
ac90: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
aca0: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
acb0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
acc0: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
acd0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
ace0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
acf0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
ad00: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
ad10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad20: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
ad30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
ad40: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
ad50: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
ad60: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
ad70: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
ad80: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
ad90: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
ada0: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
adb0: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
adc0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
add0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
ade0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adf0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ae00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae10: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ae20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ae30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae40: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
ae50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
ae60: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae70: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ae80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae90: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aea0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aeb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aec0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aed0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aee0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aef0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af10: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
af20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af30: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af40: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af60: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af70: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
af80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af90: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
afa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afb0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
afc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
afd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afe0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
aff0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b000: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b010: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b020: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b030: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b040: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b050: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b060: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b070: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b080: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b090: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b0a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0b0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b0c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0d0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0e0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b100: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b110: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
b120: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
b130: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
b140: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
b150: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
b160: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
b170: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
b180: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
b190: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
b1a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
b1b0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
b1c0: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
b1d0: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
b1e0: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
b1f0: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
b200: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
b210: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
b220: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
b230: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
b250: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
b260: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
b270: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
b280: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b290: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
b2a0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
b2b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
b2c0: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
b2d0: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
b2e0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
b2f0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
b300: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
b310: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
b320: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
b330: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
b340: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
b350: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
b360: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
b370: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
b380: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
b390: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
b3a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
b3b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b3c0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
b3d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
b3e0: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
b3f0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
b400: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
b410: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
b420: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
b430: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b440: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
b450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
b460: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
b470: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b480: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b490: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b4a0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b4b0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b4c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b4d0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b4e0: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b4f0: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b500: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b510: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b520: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b530: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b540: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b550: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b560: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b570: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b580: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b590: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b5a0: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b5b0: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b5c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b5d0: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b5e0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b5f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b600: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b610: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b620: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b630: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b640: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b650: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b660: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b670: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b680: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b690: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b6a0: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b6b0: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b6c0: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b6d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b6e0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b6f0: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b700: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b710: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b720: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b730: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b740: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b750: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b760: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b770: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b780: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b790: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b7a0: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b7b0: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b7c0: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b7f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b800: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b810: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b820: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b830: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b840: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b850: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b860: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b870: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b880: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b890: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b8b0: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b8c0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b8d0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8e0: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b8f0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b900: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b910: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b920: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b930: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b940: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b950: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b960: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b970: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b980: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b990: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b9a0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b9b0: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b9c0: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b9d0: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b9e0: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b9f0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
ba00: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
ba10: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
ba20: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
ba30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba40: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
ba50: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
ba60: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
ba70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ba80: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
ba90: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
baa0: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
bab0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
bac0: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
bad0: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
bae0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
baf0: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
bb00: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
bb10: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
bb30: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
bb40: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
bb50: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
bb60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
bb70: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
bb80: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
bb90: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
bba0: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
bbb0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bbc0: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
bbd0: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
bbe0: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
bbf0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
bc00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bc10: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
bc20: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
bc30: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
bc40: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
bc50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc70: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
bc80: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
bc90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
bca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bcb0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
bcc0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
bcd0: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
bce0: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
bcf0: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
bd00: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
bd10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bd20: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
bd30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bd40: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
bd50: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
bd60: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
bd70: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
bd80: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
bd90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bda0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
bdb0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
bdc0: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
bdd0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
bde0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
bdf0: 72 6e 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d  rn;.  if( zTail=
be00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
be10: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
be20: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
be30: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
be40: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
be50: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
be60: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
be70: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
be80: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
be90: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
bea0: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
beb0: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
bec0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
bed0: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
bee0: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
bef0: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
bf00: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
bf10: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
bf20: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
bf30: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
bf40: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
bf50: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
bf60: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
bf70: 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f  tring z[] has no
bf80: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73  thing but whites
bf90: 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  pace and comment
bfa0: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  s to the.** end 
bfb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  of the first lin
bfc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bfd0: 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63   wsToEol(const c
bfe0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
bff0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
c000: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
c010: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65   z[i]=='\n' ) re
c020: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
c030: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20  IsSpace(z[i]) ) 
c040: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
c050: 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[i]=='-' && z
c060: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74  [i+1]=='-' ) ret
c070: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
c080: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
c090: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
c0a0: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c0b0: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
c0c0: 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a  RY PLAN data.*/.
c0d0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c0e0: 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74  append(ShellStat
c0f0: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c100: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
c110: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
c120: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65  EQPGraphRow *pNe
c130: 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d  w;.  int nText =
c140: 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29   strlen30(zText)
c150: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45  ;.  if( p->autoE
c160: 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74  QPtest ){.    ut
c170: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c180: 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20  , "%d,%d,%s\n", 
c190: 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78  iEqpId, p2, zTex
c1a0: 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d  t);.  }.  pNew =
c1b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c1c0: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
c1d0: 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66   + nText );.  if
c1e0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c  ( pNew==0 ) shel
c1f0: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
c200: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49  );.  pNew->iEqpI
c210: 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e  d = iEqpId;.  pN
c220: 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20  ew->iParentId = 
c230: 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  p2;.  memcpy(pNe
c240: 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c  w->zText, zText,
c250: 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65   nText+1);.  pNe
c260: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
c270: 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  if( p->sGraph.pL
c280: 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47  ast ){.    p->sG
c290: 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78  raph.pLast->pNex
c2a0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73  t = pNew;.  }els
c2b0: 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68  e{.    p->sGraph
c2c0: 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20  .pRow = pNew;.  
c2d0: 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  }.  p->sGraph.pL
c2e0: 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  ast = pNew;.}../
c2f0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65  *.** Free and re
c300: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c310: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20  QUERY PLAN data 
c320: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f  that has been co
c330: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d  llected.** in p-
c340: 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74  >sGraph..*/.stat
c350: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65  ic void eqp_rese
c360: 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
c370: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c380: 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pRow, *pNext;. 
c390: 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73   for(pRow = p->s
c3a0: 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77  Graph.pRow; pRow
c3b0: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c3c0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f  .    pNext = pRo
c3d0: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  w->pNext;.    sq
c3e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29  lite3_free(pRow)
c3f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
c400: 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69  p->sGraph, 0, si
c410: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29  zeof(p->sGraph))
c420: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c430: 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20  he next EXPLAIN 
c440: 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20  QUERY PLAN line 
c450: 77 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74  with iEqpId that
c460: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c470: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c480: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c490: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c4a0: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c4b0: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c4c0: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c4d0: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c4e0: 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20  Id, EQPGraphRow 
c4f0: 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61  *pOld){.  EQPGra
c500: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f  phRow *pRow = pO
c510: 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74  ld ? pOld->pNext
c520: 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f   : p->sGraph.pRo
c530: 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77  w;.  while( pRow
c540: 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e   && pRow->iParen
c550: 74 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52  tId!=iEqpId ) pR
c560: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c570: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b  ;.  return pRow;
c580: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20  .}../* Render a 
c590: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
c5a0: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68  the graph that h
c5b0: 61 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73  as iEqpId as its
c5c0: 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64   parent.  Called
c5d0: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20  .** recursively 
c5e0: 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76  to render sublev
c5f0: 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  els..*/.static v
c600: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c  oid eqp_render_l
c610: 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  evel(ShellState 
c620: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b  *p, int iEqpId){
c630: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c640: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c650: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
c660: 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  (p->sGraph.zPref
c670: 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ix);.  char *z;.
c680: 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70    for(pRow = eqp
c690: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c6a0: 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  pId, 0); pRow; p
c6b0: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
c6c0: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
c6d0: 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64  xt_row(p, iEqpId
c6e0: 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  , pRow);.    z =
c6f0: 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20   pRow->zText;.  
c700: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c710: 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22  >out, "%s%s%s\n"
c720: 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  , p->sGraph.zPre
c730: 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d  fix, pNext ? "|-
c740: 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a  -" : "`--", z);.
c750: 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73      if( n<(int)s
c760: 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e  izeof(p->sGraph.
c770: 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20  zPrefix)-7 ){.  
c780: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
c790: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c7a0: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
c7b0: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
c7c0: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c7d0: 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71  vel(p, pRow->iEq
c7e0: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  pId);.      p->s
c7f0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c800: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
c820: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45   and reset the E
c830: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c840: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c850: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c860: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c870: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c880: 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68  pRow = p->sGraph
c890: 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f  .pRow;.  if( pRo
c8a0: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  w ){.    if( pRo
c8b0: 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27  w->zText[0]=='-'
c8c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
c8d0: 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a  ow->pNext==0 ){.
c8e0: 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65          eqp_rese
c8f0: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
c900: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c910: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c920: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
c930: 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a  pRow->zText+3);.
c940: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c950: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c960: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
c970: 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20  3_free(pRow);.  
c980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
c990: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c9a0: 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e  t, "QUERY PLAN\n
c9b0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ");.    }.    p-
c9c0: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c9d0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f  0] = 0;.    eqp_
c9e0: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c9f0: 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65  0);.    eqp_rese
ca00: 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  t(p);.  }.}..#if
ca10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ca20: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
ca30: 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73  CK./*.** Progres
ca40: 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  s handler callba
ca50: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
ca60: 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  t progress_handl
ca70: 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  er(void *pClient
ca80: 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53  Data) {.  ShellS
ca90: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
caa0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
cab0: 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65  ta;.  p->nProgre
cac0: 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ss++;.  if( p->n
cad0: 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50  Progress>=p->mxP
cae0: 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78  rogress && p->mx
caf0: 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20  Progress>0 ){.  
cb00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cb10: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c  out, "Progress l
cb20: 69 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75  imit reached (%u
cb30: 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  )\n", p->nProgre
cb40: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ss);.    if( p->
cb50: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cb60: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53  ELL_PROGRESS_RES
cb70: 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ET ) p->nProgres
cb80: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
cb90: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cba0: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f  SHELL_PROGRESS_O
cbb0: 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72  NCE ) p->mxProgr
cbc0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ess = 0;.    ret
cbd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
cbe0: 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73   (p->flgProgress
cbf0: 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53   & SHELL_PROGRES
cc00: 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20  S_QUIET)==0 ){. 
cc10: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
cc20: 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20  >out, "Progress 
cc30: 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72  %u\n", p->nProgr
cc40: 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ess);.  }.  retu
cc50: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
cc60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
cc70: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20  OGRESS_CALLBACK 
cc80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
cc90: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
cca0: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
ccb0: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
ccc0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
ccd0: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ccf0: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
cd00: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
cd10: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
cd20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
cd30: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
cd40: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
cd50: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
cd60: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
cd70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
cd80: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
cd90: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
cda0: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
cdb0: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
cdc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
cdd0: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
cde0: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
cdf0: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
ce00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
ce10: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
ce20: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
ce30: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
ce40: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
ce50: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
ce60: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
ce70: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
ce80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
ce90: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
cea0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
ceb0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
cec0: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
ced0: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
cee0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
cef0: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
cf00: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
cf10: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
cf20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cf30: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cf40: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
cf50: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cf60: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
cf70: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cf80: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cf90: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cfa0: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cfb0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cfc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cfd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cfe0: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cff0: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
d000: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
d010: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
d020: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
d030: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
d040: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
d050: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
d060: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
d070: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
d080: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
d090: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d0a0: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
d0b0: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d0c0: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
d0d0: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
d0e0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
d0f0: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d100: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d120: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d130: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
d140: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
d150: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
d160: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
d170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d180: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
d190: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d1a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d1b0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
d1c0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
d1d0: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d1e0: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
d200: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
d210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d220: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
d230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d240: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
d250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
d260: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
d270: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d280: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d290: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
d2a0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
d2b0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
d2c0: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
d2d0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d2e0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d300: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
d310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d320: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d330: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
d340: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
d350: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
d360: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
d370: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d380: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d390: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d3a0: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d3b0: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d3d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d3e0: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d3f0: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d420: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d430: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d440: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d460: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d470: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d480: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d4a0: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d4b0: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d4c0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d4d0: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d500: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d510: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d520: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d530: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d550: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 22  ---------------"
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 22  ---------------"
d5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5f0: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d600: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d610: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d630: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d640: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d660: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d670: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d680: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d690: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d6a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d6b0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d6c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d6d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d6e0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d700: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d710: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d720: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d730: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d740: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d750: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d770: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d780: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d790: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d7a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d7b0: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d7d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d7e0: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d7f0: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d800: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d810: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d820: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d840: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d850: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d860: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d870: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d880: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d890: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d8a0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d8b0: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d8c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d8e0: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d8f0: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d900: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d910: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d920: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d930: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d940: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d950: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d960: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d970: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d980: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d990: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d9a0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d9b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d9c0: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d9d0: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d9e0: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d9f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
da00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
da10: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
da20: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
da30: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
da40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
da50: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
da60: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
da70: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
da80: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
da90: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
daa0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
dab0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
dac0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
dad0: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
dae0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
daf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
db00: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
db10: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
db20: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
db30: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
db40: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
db50: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
db60: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
db70: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
db80: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
db90: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
dba0: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
dbb0: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
dbc0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
dbd0: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
dbe0: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
dbf0: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
dc00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dc10: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
dc20: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
dc30: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dc40: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dc50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc60: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
dc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
dc80: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
dc90: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
dca0: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
dcb0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
dcc0: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
dcd0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
dce0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
dcf0: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
dd00: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
dd10: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
dd20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
dd30: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
dd40: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dd50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dd60: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
dd70: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
dd80: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
dd90: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
dda0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddb0: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
ddc0: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
ddd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dde0: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
ddf0: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
de00: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
de10: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
de20: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
de30: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
de40: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
de50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
de60: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
de70: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
de80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
de90: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
dea0: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
dec0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
ded0: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
dee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
def0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
df10: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
df20: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
df30: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
df40: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
df50: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
df60: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
df70: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
df80: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
df90: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
dfa0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
dfb0: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
dfc0: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
dfd0: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
dfe0: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
dff0: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
e000: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
e010: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
e020: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
e030: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
e040: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
e060: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
e070: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
e080: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
e090: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
e0a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e0c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e0d0: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
e0e0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e0f0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e100: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e110: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e130: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e140: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
e150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e160: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
e170: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
e180: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e190: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e1a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e1b0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e1c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e1d0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e1e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e1f0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
e200: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
e210: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
e220: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e230: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e240: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
e250: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
e260: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e270: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e280: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e2b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e2c0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e2d0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
e2e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e2f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e300: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
e310: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e320: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e330: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e340: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e350: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e360: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e370: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e380: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e390: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e3a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e3b0: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e3c0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e3d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
e3e0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e3f0: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e410: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e420: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e430: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e440: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e450: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e460: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e470: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e480: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e490: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e4a0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e4b0: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e4c0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e4d0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e4e0: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e4f0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e500: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e510: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e530: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e540: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e560: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e570: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e580: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e590: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e5a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e5b0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e5c0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e5d0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e5e0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e5f0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e600: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e610: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e620: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e630: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e650: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e660: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e670: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e680: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e690: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e6a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e6b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e6c0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e6d0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e6e0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e6f0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e700: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e710: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e720: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e730: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
e750: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e760: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e770: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e790: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e7a0: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e7b0: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e7d0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e7e0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e7f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e800: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e810: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e820: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e830: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e840: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e850: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e860: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e870: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e880: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e890: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e8b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e8d0: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e8e0: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e900: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e910: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e920: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e930: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e940: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e960: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e970: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e980: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e990: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e9a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e9b0: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e9c0: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e9d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e9e0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e9f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ea00: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
ea10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ea20: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ea30: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ea40: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea50: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
ea60: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
ea70: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
ea90: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
eaa0: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
eab0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
eac0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ead0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
eae0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
eaf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
eb00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
eb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
eb20: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
eb30: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
eb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eb50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb60: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
eb70: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
eb80: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
eb90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eba0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ebb0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ebc0: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
ebd0: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
ebe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
ebf0: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
ec00: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ec10: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
ec20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
ec30: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ec40: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
ec50: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ec60: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ec70: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
ec80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
ec90: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
eca0: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
ecc0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ecd0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ece0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
ecf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ed00: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ed10: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
ed20: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
ed30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ed40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ed50: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ed60: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
ed70: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
ed80: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ed90: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
eda0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
edb0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
edc0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
edd0: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ede0: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
edf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ee00: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ee10: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ee20: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ee30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
ee40: 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20  t64 ur;.        
ee50: 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c    memcpy(&ur,&r,
ee60: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20  sizeof(r));.    
ee70: 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78        if( ur==0x
ee80: 37 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30  7ff0000000000000
ee90: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
eea0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
eeb0: 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20  out, "1e999");. 
eec0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
eed0: 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30  f( ur==0xfff0000
eee0: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
eef0: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
ef00: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d  rintf(p->out, "-
ef10: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ef20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ef40: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
ef50: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
ef60: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ef70: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ef80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ef90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
efa0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
efb0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
efc0: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
efd0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
efe0: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
eff0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
f000: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
f010: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
f020: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
f030: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
f040: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f050: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
f060: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
f070: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
f080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
f090: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f0a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f0b0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f0c0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f0d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f0e0: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
f0f0: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
f100: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
f110: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f120: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f130: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f150: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f160: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
f170: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f180: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
f190: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
f1a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
f1b0: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
f1c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f1d0: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
f1e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
f1f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f200: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
f210: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f220: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f230: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f240: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f250: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
f260: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
f270: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f280: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f290: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
f2a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f2b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f2c0: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
f2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
f2e0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
f2f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f300: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f310: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
f320: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
f330: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
f340: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
f350: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f360: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
f370: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f380: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
f390: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
f3a0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f3b0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f3c0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
f3d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f3e0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f3f0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f400: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f410: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f420: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
f430: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f440: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f450: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f460: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f470: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f480: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f490: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
f4a0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
f4b0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
f4c0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
f4d0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
f4e0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f500: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
f510: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
f520: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f530: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
f540: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f550: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f560: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
f570: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
f580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f590: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
f5a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f5b0: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
f5c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
f5d0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f5e0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f5f0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f600: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f610: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f620: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f630: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f640: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f650: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f660: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f670: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f680: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
f6a0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f6b0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f6c0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f6e0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f6f0: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
f700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f710: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
f720: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
f730: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
f740: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
f750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f760: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f770: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
f780: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f790: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
f7a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f7b0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f7c0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
f7d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
f7e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
f7f0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
f800: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f810: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f820: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
f830: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
f840: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f850: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f860: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f870: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f880: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f890: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f8a0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
f8b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f8c0: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
f8d0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
f8e0: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
f8f0: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
f900: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f910: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f920: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f930: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f940: 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20  MODE_EQP: {.    
f950: 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20    eqp_append(p, 
f960: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
f970: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20  atoi(azArg[1]), 
f980: 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20  azArg[3]);.     
f990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f9b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
f9c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
f9d0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
f9e0: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
f9f0: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
fa00: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
fa10: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
fa20: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
fa30: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
fa40: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
fa50: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
fa60: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
fa70: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
fa80: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
fa90: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
faa0: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
fab0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
fac0: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
fad0: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
fae0: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
faf0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
fb00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
fb10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78   from sqlite3_ex
fb20: 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64  ec() that append
fb30: 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20  s all.** output 
fb40: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
fb50: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
fb60: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
fb70: 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  t captureOutputC
fb80: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
fb90: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
fba0: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fbb0: 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54   **az){.  ShellT
fbc0: 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54  ext *p = (ShellT
fbd0: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ext*)pArg;.  int
fbe0: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
fbf0: 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66  AMETER(az);.  if
fc00: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
fc10: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
fc20: 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  n ) appendText(p
fc30: 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72  , "|", 0);.  for
fc40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
fc50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20  +){.    if( i ) 
fc60: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c  appendText(p, ",
fc70: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
fc80: 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64  zArg[i] ) append
fc90: 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d  Text(p, azArg[i]
fca0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
fcb0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
fcc0: 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f  enerate an appro
fcd0: 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20  priate SELFTEST 
fce0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
fcf0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  n database..*/.s
fd00: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
fd10: 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53  eSelftestTable(S
fd20: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
fd30: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fd40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   0;.  sqlite3_ex
fd50: 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53  ec(p->db,.    "S
fd60: 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73  AVEPOINT selftes
fd70: 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22  t_init;\n".    "
fd80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
fd90: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74  NOT EXISTS selft
fda0: 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74  est(\n".    "  t
fdb0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
fdc0: 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20  RY KEY,\n"   /* 
fdd0: 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Test number */. 
fde0: 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e     "  op TEXT,\n
fdf0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fe00: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a      /* Operator:
fe10: 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20    memo run */.  
fe20: 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e    "  cmd TEXT,\n
fe30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fe40: 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65     /* Command te
fe50: 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73  xt */.    "  ans
fe60: 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20   TEXT\n"        
fe70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
fe80: 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a  sired answer */.
fe90: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52      ");".    "CR
fea0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
feb0: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70  [_shell$self](op
fec0: 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20  ,cmd,ans);\n".  
fed0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fee0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77  _shell$self](row
fef0: 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20  id,op,cmd)\n".  
ff00: 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c    "  VALUES(coal
ff10: 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61  esce((SELECT (ma
ff20: 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46  x(tno)+100)/10 F
ff30: 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30  ROM selftest),10
ff40: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  ),\n".    "     
ff50: 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74      'memo','Test
ff60: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d  s generated by -
ff70: 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20  -init');\n".    
ff80: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
ff90: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
ffa0: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
ffb0: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27  ',\n".    "    '
ffc0: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
ffd0: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74  query(''SELECT t
ffe0: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
fff0: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
10020 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
10030 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27  ER BY 2'',224))'
10040 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
10050 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45  x(sha3_query('SE
10060 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
10070 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
100a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
100b0 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e  R BY 2',224));\n
100c0 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
100d0 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
100e0 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
100f0 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20  T 'run',".    " 
10100 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10110 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10120 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c  CT * FROM \"' ||
10130 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70  ".    "        p
10140 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29  rintf('%w',name)
10150 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45   || '\" NOT INDE
10160 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  XED'',224))',\n"
10170 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
10180 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28  a3_query(printf(
10190 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
101a0 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  "%w\" NOT INDEXE
101b0 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e  D',name),224))\n
101c0 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c  ".    "  FROM (\
101d0 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  n".    "    SELE
101e0 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
101f0 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20  ite_master\n".  
10200 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79    "     WHERE ty
10210 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20  pe='table'\n".  
10220 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61    "       AND na
10230 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e  me<>'selftest'\n
10240 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
10250 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
10260 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20  age,0)>0\n".    
10270 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52  "  )\n".    " OR
10280 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a  DER BY name;\n".
10290 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
102a0 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
102b0 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
102c0 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e  'run','PRAGMA in
102d0 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27  tegrity_check','
102e0 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ok');\n".    "IN
102f0 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65  SERT INTO selfte
10300 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e  st(tno,op,cmd,an
10310 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  s)".    "  SELEC
10320 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d  T rowid*10,op,cm
10330 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65  d,ans FROM [_she
10340 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20  ll$self];\n".   
10350 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73   "DROP TABLE [_s
10360 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20  hell$self];".   
10370 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b   ,0,0,&zErrMsg);
10380 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10390 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
103a0 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54  f(stderr, "SELFT
103b0 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  EST initializati
103c0 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e  on failure: %s\n
103d0 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
103e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
103f0 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71  rrMsg);.  }.  sq
10400 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
10410 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74  , "RELEASE selft
10420 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29  est_init",0,0,0)
10430 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
10440 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
10450 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74  table field of t
10460 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74  he ShellState st
10470 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68  ructure to.** th
10480 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
10490 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61  ble given.  Esca
104a0 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61  pe any quote cha
104b0 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a  racters in the.*
104c0 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f  * table name..*/
104d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
104e0 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c  _table_name(Shel
104f0 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
10500 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
10510 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61   int i, n;.  cha
10520 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
10530 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
10540 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
10550 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
10560 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
10570 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
10580 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
10590 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f  ) return;.  cQuo
105a0 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
105b0 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72  Name);.  n = str
105c0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
105d0 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b  if( cQuote ) n +
105e0 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e  = n+2;.  z = p->
105f0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
10600 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
10610 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ( z==0 ) shell_o
10620 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
10630 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
10640 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
10650 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
10660 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
10670 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
10680 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
10690 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
106a0 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
106b0 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
106c0 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
106d0 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
106e0 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
106f0 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
10700 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10710 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
10720 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
10730 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
10740 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
10750 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
10760 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
10770 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
10780 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
10790 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
107a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
107b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
107c0 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
107d0 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
107e0 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
107f0 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
10800 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
10810 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
10820 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
10830 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
10840 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10850 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
10860 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
10870 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
10880 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
10890 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
108a0 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
108b0 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
108c0 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
108d0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
108e0 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
108f0 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
10900 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
10910 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
10920 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
10930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
10940 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
10950 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
10960 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
10970 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
10980 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
10990 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
109a0 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
109b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
109c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
109d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
109e0 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
109f0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10a00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10a10 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
10a20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10a30 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
10a40 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
10a50 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10a70 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10a80 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
10a90 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10aa0 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10ab0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
10ac0 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
10ad0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10ae0 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
10af0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10b00 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
10b10 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10b20 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
10b30 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
10b40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
10b50 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
10b60 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
10b70 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
10b80 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
10b90 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10ba0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10bb0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
10bc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10bd0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
10be0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
10bf0 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
10c00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10c10 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
10c20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10c30 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
10c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
10c50 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
10c60 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
10c70 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
10c80 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
10c90 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
10ca0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10cb0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
10cc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10cd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10ce0 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
10cf0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10d00 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10d10 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
10d20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10d30 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
10d40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d50 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10d60 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10d70 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10d80 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10da0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10db0 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10dc0 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10dd0 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10de0 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
10df0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10e00 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
10e10 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
10e20 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
10e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
10e40 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
10e50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
10e60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10e70 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10e80 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
10e90 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
10ea0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10eb0 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
10ec0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
10ed0 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
10ee0 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10ef0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
10f00 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
10f10 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
10f20 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
10f30 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
10f40 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
10f50 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
10f60 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
10f70 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
10f80 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
10f90 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
10fa0 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
10fb0 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
10fc0 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
10fd0 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
10fe0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10ff0 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
11000 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
11010 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
11020 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
11030 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
11040 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
11050 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
11060 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
11070 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
11080 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11090 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
110a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
110b0 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
110c0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
110d0 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
110e0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
110f0 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
11100 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
11110 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11130 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
11140 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
11150 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
11180 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
11190 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
111a0 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
111b0 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
111c0 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
111d0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
111e0 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
111f0 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11200 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
11210 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
11220 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
11230 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
11240 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
11250 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
11260 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
11270 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
11280 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
11290 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
112a0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
112b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
112c0 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
112d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
112e0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
112f0 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
11310 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
11320 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
11330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
11340 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11350 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
11360 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
11370 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
11380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11390 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
113a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
113b0 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
113c0 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
113d0 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
113e0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
113f0 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
11400 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
11410 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
11420 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
11430 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
11440 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
11450 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
11460 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
11470 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
11480 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
11490 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
114a0 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
114b0 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
114c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
114d0 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
114e0 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
114f0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11500 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
11510 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
11520 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
11530 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
11540 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11550 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
11560 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
11570 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
11580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
11590 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
115a0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
115b0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
115c0 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
115d0 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
115e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
115f0 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
11600 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
11610 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
11620 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11630 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
11640 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
11650 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
11660 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
11670 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11680 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
11690 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
116a0 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
116b0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
116c0 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
116d0 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
116e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
116f0 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
11700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11710 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
11720 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11740 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
11750 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
11760 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
11770 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
11780 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
11790 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
117a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
117b0 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
117c0 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
117d0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
117e0 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f  Hiwtr;.  FILE *o
117f0 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d  ut;.  if( pArg==
11800 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d  0 || pArg->out==
11810 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11820 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b  out = pArg->out;
11830 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
11840 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74  tmt && (pArg->st
11850 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20  atsOn & 2) ){.  
11860 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78    int nCol, i, x
11870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
11880 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67  mt *pStmt = pArg
11890 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61  ->pStmt;.    cha
118a0 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43  r z[100];.    nC
118b0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
118c0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
118d0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
118e0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c  (out, "%-36s %d\
118f0 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f  n", "Number of o
11900 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c  utput columns:",
11910 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
11920 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11940 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
11950 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64  (z),z,"Column %d
11960 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78   %nname:", i, &x
11970 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11980 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11990 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
119a0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
119b0 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65  Stmt,i));.#ifnde
119c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
119d0 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c  CLTYPE.      sql
119e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
119f0 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64  , z+x, "declared
11a00 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20   type:");.      
11a10 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
11a20 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
11a30 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
11a40 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c  _decltype(pStmt,
11a50 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i));.#endif.#if
11a60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11a70 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
11a80 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  A.      sqlite3_
11a90 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11aa0 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65  , "database name
11ab0 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11ac0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ad0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11ae0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
11af0 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  base_name(pStmt,
11b00 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11b10 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11b20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65  z+x, "table name
11b30 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11b40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11b50 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11b60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
11b70 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
11b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11b90 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11ba0 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22  , "origin name:"
11bb0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11bc0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11bd0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11be0 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
11bf0 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11c10 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  }..  displayStat
11c20 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f  Line(pArg, "Memo
11c30 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  ry Used:",.     
11c40 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c50 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11c60 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
11c70 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ED, bReset);.  d
11c80 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11c90 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11ca0 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f  Outstanding Allo
11cb0 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20  cations:",.     
11cc0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11cd0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11ce0 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62  _MALLOC_COUNT, b
11cf0 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41  Reset);.  if( pA
11d00 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
11d10 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
11d20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
11d30 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11d40 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
11d50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
11d60 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11d70 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
11d80 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11d90 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
11da0 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61  t);.  }.  displa
11db0 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11dc0 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11dd0 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
11de0 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11df0 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11e00 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11e10 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
11e20 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  OW, bReset);.  d
11e30 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11e40 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c  Arg, "Largest Al
11e50 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
11e60 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
11e70 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11e80 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  LOC_SIZE, bReset
11e90 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  );.  displayStat
11ea0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
11eb0 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
11ec0 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
11ed0 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
11ee0 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11ef0 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
11f00 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
11f10 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
11f20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11f30 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
11f40 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
11f50 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11f60 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
11f70 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
11f80 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
11f90 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b  dif..  if( db ){
11fa0 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
11fb0 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11fc0 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
11fd0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11fe0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
11ff0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12000 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12010 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
12020 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
12030 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
12040 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
12050 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
12060 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12080 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
12090 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
120a0 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
120b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
120c0 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
120d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
120e0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
120f0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12100 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12130 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12140 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12150 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
12160 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
12170 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
12180 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12190 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
121a0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
121b0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
121c0 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
121d0 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12200 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12210 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12220 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12230 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
12240 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
12250 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
12260 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
12270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12280 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12290 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
122a0 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
122b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122c0 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
122d0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
122e0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
122f0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12300 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12310 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
12320 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12330 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
12340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
12350 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12360 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12370 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12380 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12390 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
123a0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
123b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
123c0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
123d0 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
123f0 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12400 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
12410 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12420 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12430 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
12440 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
12450 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
12460 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12470 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12480 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
12490 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124c0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
124d0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
124e0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
124f0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12500 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
12510 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12520 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12530 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
12540 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12570 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12580 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12590 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
125a0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
125b0 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
125c0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
125d0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
125e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
125f0 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12620 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12630 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12640 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
12650 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
12660 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69  _CACHE_SPILL, &i
12670 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
12680 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12690 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
126a0 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20  e cache spills: 
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
126d0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
126e0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
126f0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12700 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12710 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
12720 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12730 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12740 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12750 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55  , "Schema Heap U
12760 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
12770 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
12780 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12790 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
127a0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
127b0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
127c0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
127d0 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
127e0 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
127f0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12800 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12810 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
12820 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
12830 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
12840 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
12850 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
12860 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  }..  if( pArg->p
12870 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
12880 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12890 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
128a0 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
128b0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
128c0 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
128f0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12900 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
12910 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12930 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12940 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12950 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12960 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12970 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
12980 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12990 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
129a0 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
129b0 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
129c0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
129d0 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
129e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
129f0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12a00 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12a10 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
12a20 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12a30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12a40 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
12a50 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
12a60 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12a70 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12a80 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12a90 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12aa0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12ab0 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
12ac0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12ad0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12ae0 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
12af0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
12b00 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12b10 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12b20 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12b30 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12b40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12b50 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73  _REPREPARE, bRes
12b60 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12b70 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12b80 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74  Reprepare operat
12b90 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12ba0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12bb0 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12bc0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12bd0 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12be0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12bf0 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20  _RUN, bReset);. 
12c00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12c10 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
12c20 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20   of times run:  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12c40 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12c50 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12c60 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12c70 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12c80 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53  STMTSTATUS_MEMUS
12c90 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ED, bReset);.   
12ca0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12cb0 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75  ->out, "Memory u
12cc0 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20  sed by prepared 
12cd0 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c  stmt:        %d\
12ce0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
12cf0 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
12d00 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
12d10 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
12d20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12d30 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
12d40 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
12d50 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
12d60 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
12d70 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
12d80 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
12d90 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
12da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12db0 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
12dc0 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
12dd0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12de0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12df0 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
12e00 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
12e30 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
12e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
12e50 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
12e60 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
12e70 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
12e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e90 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
12ea0 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
12eb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12ec0 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
12ed0 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
12ee0 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
12ef0 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
12f00 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
12f10 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
12f20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
12f30 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
12f40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12f50 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
12f60 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
12f70 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
12f80 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
12f90 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
12fa0 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
12fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
12fc0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
12fd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12fe0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12ff0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
13000 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
13010 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
13020 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13030 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13040 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
13050 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
13060 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
13070 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
13080 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
13090 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
130a0 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
130b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
130c0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
130d0 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
130e0 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
130f0 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
13100 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13110 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
13120 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
13130 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
13140 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
13150 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
13160 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
13170 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
13180 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
13190 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
131a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
131b0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
131c0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
131d0 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
131e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
131f0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13200 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13210 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
13220 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
13230 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
13240 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
13250 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
13260 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
13270 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
13280 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
13290 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
132a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
132b0 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
132c0 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
132d0 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
132e0 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
132f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
13300 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
13310 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
13320 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
13330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
13340 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
13350 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
13380 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
13390 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
133a0 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
133b0 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
133c0 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
133d0 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
133e0 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
133f0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
13400 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
13410 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
13420 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
13430 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
13440 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
13450 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
13460 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
13470 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
13480 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
13490 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
134a0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
134b0 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
134c0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
134d0 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
134e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
134f0 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
13500 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
13510 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
13520 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
13530 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
13540 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
13550 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
13560 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
13570 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
13580 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
13590 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
135a0 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
135b0 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
135c0 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
135d0 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
135e0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
135f0 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
13600 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
13610 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
13620 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
13630 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
13640 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
13650 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
13660 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
13670 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
13680 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
13690 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
136a0 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
136b0 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
136c0 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
136d0 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
136e0 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
136f0 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
13700 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
13710 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
13720 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
13730 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
13740 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
13750 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
13760 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
13770 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
13780 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
13790 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
137a0 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
137b0 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
137c0 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
137d0 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
137e0 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
137f0 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
13800 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
13810 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
13820 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
13830 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
13840 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
13850 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13860 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
13870 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
13880 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
13890 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
138a0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
138b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
138c0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
138d0 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
138e0 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
138f0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
13900 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13910 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
13920 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
13930 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
13940 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
13950 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
13960 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
13970 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
139a0 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
139b0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
139c0 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
139d0 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
139e0 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
139f0 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
13a00 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20  "SorterNext", 0 
13a10 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13a20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22  *azYield[] = { "
13a30 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22  Yield", "SeekLT"
13a40 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77  , "SeekGT", "Row
13a50 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20  SetRead",.      
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20        "Rewind", 
13a80 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
13a90 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20  r *azGoto[] = { 
13aa0 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20  "Goto", 0 };..  
13ab0 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  /* Try to figure
13ac0 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20   out if this is 
13ad0 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49  really an EXPLAI
13ae0 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  N statement. If 
13af0 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  this.  ** cannot
13b00 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65   be verified, re
13b10 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  turn early.  */.
13b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
13b30 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29  lumn_count(pSql)
13b40 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d  !=8 ){.    p->cM
13b50 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13b60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13b70 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13b80 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
13b90 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13ba0 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
13bb0 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
13bc0 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
13bd0 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
13be0 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
13bf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13c00 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
13c10 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70  in", 7) ){.    p
13c20 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13c30 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13c40 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b   }..  for(iOp=0;
13c50 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
13c60 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b  ite3_step(pSql);
13c70 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74   iOp++){.    int
13c80 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64   i;.    int iAdd
13c90 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
13ca0 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b  mn_int(pSql, 0);
13cb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13cc0 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
13cd0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13ce0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
13cf0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32  ;..    /* Set p2
13d00 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64   to the P2 field
13d10 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
13d20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73  opcode. Then, as
13d30 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20  suming that.    
13d40 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74  ** p2 is an inst
13d50 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  ruction address,
13d60 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32   set variable p2
13d70 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  op to the index 
13d80 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  of that.    ** i
13d90 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13da0 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e aiIndent[] arr
13db0 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20  ay. p2 and p2op 
13dc0 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
13dd0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   if.    ** the c
13de0 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69  urrent instructi
13df0 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
13e00 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65  sub-program gene
13e10 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20  rated by an.    
13e20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f  ** SQL trigger o
13e30 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  r foreign key.  
13e40 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20  */.    int p2 = 
13e50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13e60 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  nt(pSql, 3);.   
13e70 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20   int p2op = (p2 
13e80 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a  + (iOp-iAddr));.
13e90 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
13ea0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72   p->aiIndent arr
13eb0 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a  ay as required *
13ec0 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e  /.    if( iOp>=n
13ed0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
13ee0 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  f( iOp==0 ){.   
13ef0 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68       /* Do furth
13f00 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74  er verfication t
13f10 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c  hat this is expl
13f20 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f  ain output.  Abo
13f30 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  rt if.        **
13f40 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20   it is not */.  
13f50 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
13f60 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  st char *explain
13f70 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Cols[] = {.     
13f80 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
13f90 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
13fa0 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
13fb0 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20  "p5", "comment" 
13fc0 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  };.        int j
13fd0 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
13fe0 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a  j=0; jj<ArraySiz
13ff0 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20  e(explainCols); 
14000 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
14010 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69   if( strcmp(sqli
14020 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
14030 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e  pSql,jj),explain
14040 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a  Cols[jj])!=0 ){.
14050 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
14060 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
14070 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14080 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
140a0 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
140b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
140c0 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20   }.      nAlloc 
140d0 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d  += 100;.      p-
140e0 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74  >aiIndent = (int
140f0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
14100 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c  c64(p->aiIndent,
14110 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
14120 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14130 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29  p->aiIndent==0 )
14140 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
14150 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62  mory();.      ab
14160 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
14170 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
14180 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
14190 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
141a0 20 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d      if( abYield=
141b0 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
141c0 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
141d0 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f  }.    abYield[iO
141e0 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61  p] = str_in_arra
141f0 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b  y(zOp, azYield);
14200 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .    p->aiIndent
14210 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70  [iOp] = 0;.    p
14220 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b  ->nIndent = iOp+
14230 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f  1;..    if( str_
14240 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
14250 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66  Next) ){.      f
14260 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
14270 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
14280 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
14290 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  }.    if( str_in
142a0 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f  _array(zOp, azGo
142b0 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e  to) && p2op<p->n
142c0 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28  Indent.     && (
142d0 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c  abYield[p2op] ||
142e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
142f0 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20  int(pSql, 2)).  
14300 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69    ){.      for(i
14310 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14320 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14330 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
14340 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  }..  p->iIndent 
14350 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
14360 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20  ree(abYield);.  
14370 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
14380 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ql);.}../*.** Fr
14390 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c  ee the array all
143a0 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69  ocated by explai
143b0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29  n_data_prepare()
143c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
143d0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
143e0 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lete(ShellState 
143f0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
14400 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29  ree(p->aiIndent)
14410 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  ;.  p->aiIndent 
14420 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e  = 0;.  p->nInden
14430 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64  t = 0;.  p->iInd
14440 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
14450 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65  * Disable and re
14460 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63  store .wheretrac
14470 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61  e and .selecttra
14480 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a  ce settings..*/.
14490 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
144a0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
144b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
144c0 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
144d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
144e0 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73  e3SelectTrace;.s
144f0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53  tatic int savedS
14500 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
14510 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14520 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14530 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
14540 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
14550 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
14560 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
14570 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
14580 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
14590 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  if.static void d
145a0 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
145b0 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
145c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
145d0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
145e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
145f0 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14600 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61    savedSelectTra
14610 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ce = sqlite3Sele
14620 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  ctTrace;.  sqlit
14630 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
14640 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
14650 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14660 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14670 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
14680 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  RETRACE).  saved
14690 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c  WhereTrace = sql
146a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
146b0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
146c0 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
146d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
146e0 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
146f0 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14700 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14710 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14720 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14730 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
14740 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
14750 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63  ace = savedSelec
14760 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
14770 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14780 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14790 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
147a0 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
147b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
147c0 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72  e = savedWhereTr
147d0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ace;.#endif.}../
147e0 2a 20 43 72 65 61 74 65 20 74 68 65 20 54 45 4d  * Create the TEM
147f0 50 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  P table used to 
14800 73 74 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20  store parameter 
14810 62 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74  bindings */.stat
14820 69 63 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62  ic void bind_tab
14830 6c 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61  le_init(ShellSta
14840 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72  te *p){.  int wr
14850 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71  Schema = 0;.  sq
14860 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
14870 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  p->db, SQLITE_DB
14880 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
14890 53 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53  SCHEMA, -1, &wrS
148a0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
148b0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
148c0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
148d0 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45  IG_WRITABLE_SCHE
148e0 4d 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  MA, 1, 0);.  sql
148f0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
14900 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
14910 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
14920 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72   temp.sqlite_par
14930 61 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20  ameters(\n".    
14940 22 20 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d  "  key TEXT PRIM
14950 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20  ARY KEY,\n".    
14960 22 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a  "  value ANY\n".
14970 20 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52      ") WITHOUT R
14980 4f 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30  OWID;",.    0, 0
14990 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
149a0 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
149b0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
149c0 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
149d0 2c 20 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a  , wrSchema, 0);.
149e0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61  }../*.** Bind pa
149f0 72 61 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72  rameters on a pr
14a00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14a10 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
14a20 72 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74  r bindings are t
14a30 61 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50  aken from a TEMP
14a40 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f   table of the fo
14a50 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  rm:.**.**    CRE
14a60 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
14a70 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73  qlite_parameters
14a80 28 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52  (key TEXT PRIMAR
14a90 59 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a  Y KEY, value).**
14aa0 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49      WITHOUT ROWI
14ab0 44 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64  D;.**.** No bind
14ac0 69 6e 67 73 20 6f 63 63 75 72 20 69 66 20 74 68  ings occur if th
14ad0 69 73 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  is table does no
14ae0 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 73 70  t exist.  The sp
14af0 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 20  ecial character 
14b00 27 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64  '$'.** is includ
14b10 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ed in the table 
14b20 6e 61 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65  name to help pre
14b30 76 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  vent collisions 
14b40 77 69 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c  with actual tabl
14b50 65 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  es..** The table
14b60 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20   must be in the 
14b70 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  TEMP schema..*/.
14b80 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64  static void bind
14b90 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53  _prepared_stmt(S
14ba0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
14bb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14bc0 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61  Stmt){.  int nVa
14bd0 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
14be0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
14bf0 73 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20  stmt *pQ = 0;.. 
14c00 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
14c10 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
14c20 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  ount(pStmt);.  i
14c30 66 28 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74  f( nVar==0 ) ret
14c40 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67  urn;  /* Nothing
14c50 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20   to do */.  if( 
14c60 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
14c70 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41  lumn_metadata(pA
14c80 72 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20  rg->db, "TEMP", 
14c90 22 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65  "sqlite_paramete
14ca0 72 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rs",.           
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20           "key", 
14cd0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d  0, 0, 0, 0, 0)!=
14ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14cf0 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61   return; /* Para
14d00 6d 65 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73  meter table does
14d10 20 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20   not exist */.  
14d20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14d30 5f 70 72 65 70 61 72 65 5f 76 32 28 70 41 72 67  _prepare_v2(pArg
14d40 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
14d50 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
14d60 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70  OM temp.sqlite_p
14d70 61 72 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20  arameters".     
14d80 20 20 20 20 20 22 20 57 48 45 52 45 20 6b 65 79       " WHERE key
14d90 3d 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30  =?1", -1, &pQ, 0
14da0 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70  );.  if( rc || p
14db0 51 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Q==0 ) return;. 
14dc0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
14dd0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  r; i++){.    cha
14de0 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
14df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
14e00 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
14e10 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
14e20 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
14e30 28 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20  ( zVar==0 ){.   
14e40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
14e50 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29  ntf(sizeof(zNum)
14e60 2c 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a  ,zNum,"?%d",i);.
14e70 20 20 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75        zVar = zNu
14e80 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
14e90 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
14ea0 51 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20  Q, 1, zVar, -1, 
14eb0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
14ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
14ed0 73 74 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45  step(pQ)==SQLITE
14ee0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71  _ROW ){.      sq
14ef0 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
14f00 28 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74  (pStmt, i, sqlit
14f10 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
14f20 70 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c  pQ, 0));.    }el
14f30 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14f40 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
14f50 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, i);.    }.   
14f60 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14f70 51 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  Q);.  }.  sqlite
14f80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a  3_finalize(pQ);.
14f90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70  }../*.** Run a p
14fa0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
14fb0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
14fc0 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
14fd0 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  tmt(.  ShellStat
14fe0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
15010 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
15020 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
15030 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20  mt *pStmt       
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65         /* Statme
15060 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a  nt to run */.){.
15070 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15080 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
15090 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
150a0 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
150b0 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
150c0 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
150d0 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
150e0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
150f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15100 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
15110 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
15120 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
15130 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
15140 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
15150 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
15160 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
15170 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
15180 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
15190 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
151a0 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
151b0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
151c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33  lite3_malloc64(3
151d0 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
151e0 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
151f0 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
15200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15210 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15220 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
15230 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61   **azCols = (cha
15240 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20  r **)pData;     
15250 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73   /* Names of res
15260 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
15270 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61       char **azVa
15280 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f  ls = &azCols[nCo
15290 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  l];       /* Res
152a0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
152b0 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
152c0 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
152d0 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
152e0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
152f0 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65  i, x;.      asse
15300 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
15310 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
15320 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  );.      /* save
15330 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
15340 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
15350 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15360 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15370 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
15380 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
15390 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
153a0 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
153b0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f     do{.        /
153c0 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
153d0 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
153e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  s */.        for
153f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15400 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69  +){.          ai
15410 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
15420 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
15430 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
15440 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
15450 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
15460 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
15470 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
15480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
15490 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
154a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
154b0 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
154c0 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71  s[i] = (char*)sq
154d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
154e0 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
154f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15500 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
15510 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
15520 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
15530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
15540 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15550 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15560 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20  ak; /* from for 
15570 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
15580 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
15590 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
155a0 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74  /* if data and t
155b0 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73  ypes extracted s
155c0 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a  uccessfully... *
155d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  /.        if( SQ
155e0 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
155f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
15600 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
15610 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
15620 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
15630 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
15640 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  if( shell_callba
15650 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61  ck(pArg, nCol, a
15660 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61  zVals, azCols, a
15670 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20  iTypes) ){.     
15680 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15690 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20  TE_ABORT;.      
156a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
156c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
156d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77       }.      } w
156f0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
15700 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
15710 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
15720 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ta);.    }.  }.}
15730 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15740 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
15750 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  LE./*.** This fu
15760 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15770 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
15780 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
15790 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  shell command.**
157a0 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20   was ".expert". 
157b0 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51  It passes the SQ
157c0 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  L in the second 
157d0 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c  argument directl
157e0 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69  y to.** the sqli
157f0 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74  te3expert object
15800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
15810 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
15820 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15830 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
15840 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
15850 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
15860 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20  (*pzErr) may be 
15870 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
15880 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
15890 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73  ing.** an Englis
158a0 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
158b0 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
158c0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
158d0 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
158e0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
158f0 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
15900 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
15910 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
15920 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e  ic int expertHan
15930 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53  dleSQL(.  ShellS
15940 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
15960 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  l, .  char **pzE
15970 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rr.){.  assert( 
15980 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15990 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Expert );.  asse
159a0 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20  rt( pzErr==0 || 
159b0 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72  *pzErr==0 );.  r
159c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78  eturn sqlite3_ex
159d0 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d  pert_sql(pState-
159e0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c  >expert.pExpert,
159f0 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d   zSql, pzErr);.}
15a00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15a10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15a20 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74  either to silent
15a30 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  ly clean up the 
15a40 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65  object.** create
15a50 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72  d by the ".exper
15a60 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62  t" command (if b
15a70 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74  Cancel==1), or t
15a80 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a  o generate a .**
15a90 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20   report from it 
15aa0 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69  and then clean i
15ab0 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c  t up (if bCancel
15ac0 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ==0)..**.** If s
15ad0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
15ae0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15af0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
15b00 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
15b10 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
15b20 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
15b30 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
15b40 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15b50 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
15b60 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
15b70 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
15b80 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15b90 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15ba0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15bb0 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
15bc0 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
15bd0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
15be0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
15bf0 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c  tFinish(.  Shell
15c00 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20  State *pState,. 
15c10 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20   int bCancel,.  
15c20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
15c30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15c40 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65  E_OK;.  sqlite3e
15c50 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74  xpert *p = pStat
15c60 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
15c70 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  t;.  assert( p )
15c80 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e  ;.  assert( bCan
15c90 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20  cel || pzErr==0 
15ca0 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
15cb0 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30    if( bCancel==0
15cc0 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75   ){.    FILE *ou
15cd0 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
15ce0 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
15cf0 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  e = pState->expe
15d00 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20  rt.bVerbose;..  
15d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15d20 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c  xpert_analyze(p,
15d30 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
15d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65  {.      int nQue
15d60 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ry = sqlite3_exp
15d70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20  ert_count(p);.  
15d80 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
15d90 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
15da0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
15db0 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71  char *zCand = sq
15dc0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
15dd0 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52  ort(p,0,EXPERT_R
15de0 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53  EPORT_CANDIDATES
15df0 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
15e00 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43  rintf(out, "-- C
15e10 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d  andidates ------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e30 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
15e40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15e50 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61  out, "%s\n", zCa
15e60 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
15e70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51     for(i=0; i<nQ
15e80 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  uery; i++){.    
15e90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ea0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
15eb0 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
15ec0 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
15ed0 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63  _SQL);.        c
15ee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
15ef0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
15f00 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
15f10 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45  PERT_REPORT_INDE
15f20 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  XES);.        co
15f30 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
15f40 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15f50 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15f60 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29  ERT_REPORT_PLAN)
15f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
15f80 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22  dx==0 ) zIdx = "
15f90 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29  (no new indexes)
15fa0 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \n";.        if(
15fb0 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
15fc0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15fd0 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79  f(out, "-- Query
15fe0 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   %d ------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20  ----\n",i+1);.  
16010 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
16020 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22  tf(out, "%s\n\n"
16030 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
16040 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
16050 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
16060 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20  ", zIdx);.      
16070 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
16080 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b  , "%s\n", zEQP);
16090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   }.  sqlite3_exp
160b0 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a  ert_destroy(p);.
160c0 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
160d0 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20  .pExpert = 0;.  
160e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
160f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
16100 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20  on of ".expert" 
16110 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
16120 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
16130 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
16140 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
16150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
16160 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
16170 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
16180 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
161b0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
161c0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
161d0 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
16200 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
16210 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
16230 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
16240 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
16250 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73  ample = 0;..  as
16260 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
16270 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
16280 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74  );.  memset(&pSt
16290 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20  ate->expert, 0, 
162a0 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66  sizeof(ExpertInf
162b0 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  o));..  for(i=1;
162c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
162d0 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  & i<nArg; i++){.
162e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
162f0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[i];.    int 
16300 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  n;.    if( z[0]=
16310 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
16320 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d  ' ) z++;.    n =
16330 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
16340 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d    if( n>=2 && 0=
16350 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65  =strncmp(z, "-ve
16360 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20  rbose", n) ){.  
16370 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
16380 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  rt.bVerbose = 1;
16390 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
163a0 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
163b0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70  trncmp(z, "-samp
163c0 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  le", n) ){.     
163d0 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29   if( i==(nArg-1)
163e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
163f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16400 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
16410 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
16420 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
16430 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16440 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
16450 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20          iSample 
16460 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
16470 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b  lue(azArg[++i]);
16480 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61  .        if( iSa
16490 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c  mple<0 || iSampl
164a0 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  e>100 ){.       
164b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
164c0 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74  derr, "value out
164d0 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22   of range: %s\n"
164e0 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
164f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16500 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16520 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
16530 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
16540 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
16550 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
16560 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16570 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16580 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
16590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
165a0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
165b0 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Expert = sqlite3
165c0 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61  _expert_new(pSta
165d0 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a  te->db, &zErr);.
165e0 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e      if( pState->
165f0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
16600 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
16610 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
16620 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
16630 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  w: %s\n", zErr);
16640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16650 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
16660 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
16670 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67  e3_expert_config
16680 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61  (.          pSta
16690 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
166a0 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49  rt, EXPERT_CONFI
166b0 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c  G_SAMPLE, iSampl
166c0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
166d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
166e0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  c;.}.#endif /* i
166f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16700 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
16710 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  /../*.** Execute
16720 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
16730 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
16740 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
16750 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
16760 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
16770 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
16780 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
16790 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
167a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
167b0 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
167c0 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
167d0 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
167e0 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
167f0 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
16800 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
16810 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
16820 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
16830 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
16840 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
16850 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74  _exec(.  ShellSt
16860 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16890 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
168a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
168b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
168c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
168d0 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  L to be evaluate
168e0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
168f0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
16920 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
16930 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16940 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
16950 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
16960 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
16970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16980 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
16990 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
169a0 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
169b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
169c0 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
169d0 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
169e0 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20  cessed SQL */.  
169f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41  sqlite3 *db = pA
16a00 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  rg->db;..  if( p
16a10 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a  zErrMsg ){.    *
16a20 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b  pzErrMsg = NULL;
16a30 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16a40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16a50 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72  LTABLE.  if( pAr
16a60 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  g->expert.pExper
16a70 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78  t ){.    rc = ex
16a80 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41  pertHandleSQL(pA
16a90 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d  rg, zSql, pzErrM
16aa0 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
16ab0 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72  expertFinish(pAr
16ac0 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  g, (rc!=SQLITE_O
16ad0 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  K), pzErrMsg);. 
16ae0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
16af0 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28  le( zSql[0] && (
16b00 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29  SQLITE_OK == rc)
16b10 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
16b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74  onst char *zStmt
16b30 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Sql;.    rc = sq
16b40 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16b50 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
16b60 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
16b70 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
16b80 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
16b90 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
16ba0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
16bb0 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
16bc0 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
16bd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
16be0 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
16bf0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
16c00 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
16c10 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
16c20 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
16c30 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
16c40 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
16c50 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
16c60 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
16c70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
16c90 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
16ca0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
16cb0 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d     if( zStmtSql=
16cc0 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20  =0 ) zStmtSql = 
16cd0 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "";.      while(
16ce0 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71   IsSpace(zStmtSq
16cf0 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c  l[0]) ) zStmtSql
16d00 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61  ++;..      /* sa
16d10 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
16d20 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
16d30 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
16d40 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
16d50 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
16d60 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
16d70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
16d80 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
16d90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16da0 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
16db0 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
16dc0 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
16dd0 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48  ( pArg && ShellH
16de0 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46  asFlag(pArg, SHF
16df0 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20  LG_Echo) ){.    
16e00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
16e10 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  pArg->out, "%s\n
16e20 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53  ", zStmtSql ? zS
16e30 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a  tmtSql : zSql);.
16e40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16e50 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41  * Show the EXPLA
16e60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66  IN QUERY PLAN if
16e70 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20   .eqp is on */. 
16e80 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
16e90 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26   pArg->autoEQP &
16ea0 26 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69  & sqlite3_stmt_i
16eb0 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d  sexplain(pStmt)=
16ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
16ed0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
16ee0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
16ef0 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
16f00 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
16f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
16f20 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
16f30 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
16f40 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
16f50 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
16f60 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
16f70 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
16f80 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
16f90 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16fa0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
16fb0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
16fc0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
16fd0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
16fe0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
16ff0 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
17000 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
17010 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17020 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
17030 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
17040 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
17050 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
17060 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
17070 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
17080 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
170a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
170b0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
170c0 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
170d0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
170e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
170f0 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
17100 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
17110 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
17120 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
17130 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
17140 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17150 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
17160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17170 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
17180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17190 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
171a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
171b0 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
171c0 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
171d0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
171e0 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
171f0 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
17200 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
17210 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17220 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
17230 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
17240 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
17250 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
17260 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
17270 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
17280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
17290 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
172a0 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
172b0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
172c0 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
172d0 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
172e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
172f0 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
17300 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
17310 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
17320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
17330 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17340 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
17350 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
17360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17380 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
17390 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
173a0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
173b0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
173c0 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
173d0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
173e0 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
173f0 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
17400 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
17410 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
17420 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
17430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
17450 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
17460 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17470 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
17480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17490 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
174a0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
174b0 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
174c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
174d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
174e0 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
174f0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
17500 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
17510 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
17520 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
17530 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
17540 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
17550 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
17560 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
17570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
17580 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
17590 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
175a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
175b0 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
175c0 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
175d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
175e0 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
175f0 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
17600 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
17610 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
17620 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
17630 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
17640 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
17650 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
17660 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
17670 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70  stmt_isexplain(p
17680 53 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20  Stmt)==1 ){.    
17690 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
176a0 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
176b0 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  in;.          }.
176c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
176d0 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70  lite3_stmt_isexp
176e0 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29  lain(pStmt)==2 )
176f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41  {.            pA
17700 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45  rg->cMode = MODE
17710 5f 45 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20  _EQP;.          
17720 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
17730 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
17740 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c  hell is currentl
17750 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20  y in ".explain" 
17760 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65  mode, gather the
17770 20 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a   extra.        *
17780 2a 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  * data required 
17790 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74  to add indents t
177a0 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a  o the output.*/.
177b0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
177c0 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
177d0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
177e0 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
177f0 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53  prepare(pArg, pS
17800 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tmt);.        }.
17810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
17820 69 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  ind_prepared_stm
17830 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  t(pArg, pStmt);.
17840 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
17850 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
17860 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70  Stmt);.      exp
17870 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
17880 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71  (pArg);.      eq
17890 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
178a0 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
178b0 75 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73  usage stats if s
178c0 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20  tats on */.     
178d0 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
178e0 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  g->statsOn ){.  
178f0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
17900 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29  ats(db, pArg, 0)
17910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17920 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63   /* print loop-c
17930 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69  ounters if requi
17940 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
17950 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
17960 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  canstatsOn ){.  
17970 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63        display_sc
17980 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67  anstats(db, pArg
17990 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
179a0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
179b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74  e statement just
179c0 20 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68   executed. If th
179d0 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61  is fails, save a
179e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
179f0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
17a00 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
17a10 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e  set zSql to poin
17a20 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17a30 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  * next statement
17a40 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
17a50 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
17a60 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17a70 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
17a80 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
17a90 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
17aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
17ac0 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
17ad0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
17ae0 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
17af0 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
17b00 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
17b10 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
17b20 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
17b30 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
17b40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
17b50 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
17b60 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
17b70 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
17b80 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
17b90 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
17ba0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
17bb0 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
17bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17bd0 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
17be0 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
17bf0 61 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c  ated by tableCol
17c00 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  umnList()..*/.st
17c10 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f  atic void freeCo
17c20 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a  lumnList(char **
17c30 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  azCol){.  int i;
17c40 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f  .  for(i=1; azCo
17c50 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
17c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17c70 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ol[i]);.  }.  /*
17c80 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73   azCol[0] is a s
17c90 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a  tatic string */.
17ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17cb0 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zCol);.}../*.** 
17cc0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
17cd0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72   pointers to str
17ce0 69 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74  ings which are t
17cf0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a  he names of all.
17d00 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  ** columns in ta
17d10 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20  ble zTab.   The 
17d20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  memory to hold t
17d30 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61  he names is dyna
17d40 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
17d50 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65  ated and must be
17d60 20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65   released by the
17d70 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20   caller using a 
17d80 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
17d90 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e  ** to freeColumn
17da0 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  List()..**.** Th
17db0 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79  e azCol[0] entry
17dc0 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c   is usually NULL
17dd0 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a  .  However, if z
17de0 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  Tab contains a r
17df0 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68  owid.** value th
17e00 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
17e10 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61  reserved, then a
17e20 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65  zCol[0] is fille
17e30 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a  d in with the.**
17e40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77   name of the row
17e50 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  id column..**.**
17e60 20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c   The first regul
17e70 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ar column in the
17e80 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b   table is azCol[
17e90 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  1].  The list is
17ea0 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62   terminated.** b
17eb0 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  y an entry with 
17ec0 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a  azCol[i]==0..*/.
17ed0 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61  static char **ta
17ee0 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68  bleColumnList(Sh
17ef0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
17f00 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
17f10 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
17f20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17f30 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
17f40 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e  r *zSql;.  int n
17f50 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Col = 0;.  int n
17f60 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74  Alloc = 0;.  int
17f70 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20   nPK = 0;       
17f80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49  /* Number of PRI
17f90 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
17fa0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
17fb0 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  sIPK = 0;     /*
17fc0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49   True if one PRI
17fd0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
17fe0 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  of type INTEGER 
17ff0 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76  */.  int preserv
18000 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61  eRowid = ShellHa
18010 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  sFlag(p, SHFLG_P
18020 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20  reserveRowid);. 
18030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c   int rc;..  zSql
18040 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18050 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
18060 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29  _info=%Q", zTab)
18070 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18080 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
18090 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
180a0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
180b0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
180c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
180d0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
180e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
180f0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18100 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41      if( nCol>=nA
18110 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20  lloc-2 ){.      
18120 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a  nAlloc = nAlloc*
18130 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20  2 + nCol + 10;. 
18140 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c       azCol = sql
18150 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43  ite3_realloc(azC
18160 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ol, nAlloc*sizeo
18170 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  f(azCol[0]));.  
18180 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
18190 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
181a0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
181b0 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c      azCol[++nCol
181c0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
181d0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
181e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
181f0 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
18200 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
18210 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29  _int(pStmt, 5) )
18220 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20  {.      nPK++;. 
18230 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a       if( nPK==1.
18240 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
18250 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74  3_stricmp((const
18260 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
18270 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
18280 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,2),.           
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
182a0 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
182b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
182c0 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
182d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
182e0 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
182f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18300 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
18310 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f  tmt);.  if( azCo
18320 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
18330 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b  .  azCol[0] = 0;
18340 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d  .  azCol[nCol+1]
18350 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 0;..  /* The 
18360 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74  decision of whet
18370 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77  her or not a row
18380 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20  id really needs 
18390 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a  to be preserved.
183a0 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20    ** is tricky. 
183b0 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74   We never need t
183c0 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77  o preserve a row
183d0 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  id for a WITHOUT
183e0 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a   ROWID table.  *
183f0 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  * or a table wit
18400 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  h an INTEGER PRI
18410 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72  MARY KEY.  We ar
18420 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73  e unable to pres
18430 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73  erve.  ** rowids
18440 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
18450 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
18460 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75  accessible becau
18470 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  se there are oth
18480 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  er.  ** columns 
18490 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  in the table nam
184a0 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f  ed "rowid", "_ro
184b0 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22  wid_", and "oid"
184c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
184d0 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73  serveRowid && is
184e0 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  IPK ){.    /* If
184f0 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52   a single PRIMAR
18500 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74  Y KEY column wit
18510 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77  h type INTEGER w
18520 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74  as seen, then it
18530 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
18540 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68   an alise for th
18550 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74  e ROWID.  But it
18560 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
18570 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
18580 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61     ** table or a
18590 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
185a0 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e   KEY DESC column
185b0 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69  , neither of whi
185c0 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f  ch are.    ** RO
185d0 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f  WID aliases.  To
185e0 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
185f0 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20  se cases, check 
18600 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
18610 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22   there is a "pk"
18620 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d   entry in "PRAGM
18630 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20  A index_list".  
18640 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20  There will be.  
18650 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64    ** no "pk" ind
18660 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ex if the PRIMAR
18670 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20  Y KEY really is 
18680 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
18690 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20   ROWID..    */. 
186a0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
186b0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
186c0 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  T 1 FROM pragma_
186d0 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a  index_list(%Q)".
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
18700 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c  RE origin='pk'",
18710 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d   zTab);.    rc =
18720 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18730 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
18740 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18760 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
18770 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65   rc ){.      fre
18780 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
18790 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
187a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63   0;.    }.    rc
187b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
187c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
187d0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
187e0 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76  mt);.    preserv
187f0 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
18800 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
18810 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
18820 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
18830 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
18840 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
18850 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
18860 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
18870 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
18880 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
18890 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
188a0 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
188b0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
188c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
188d0 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
188e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
188f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18900 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
18910 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
18920 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
18930 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18940 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
18950 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
18960 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
18970 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
18980 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
18990 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
189a0 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
189b0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
189c0 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
189d0 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
189e0 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
189f0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
18a00 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
18a10 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
18a20 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
18a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
18a40 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
18a50 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
18a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18a70 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
18a80 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
18a90 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
18aa0 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
18ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18ac0 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
18ad0 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
18ae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
18b10 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67  l;.}../*.** Togg
18b20 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75  le the reverse_u
18b30 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
18b40 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   setting..*/.sta
18b50 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53  tic void toggleS
18b60 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74  electOrder(sqlit
18b70 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
18b80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18b90 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69   0;.  int iSetti
18ba0 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ng = 0;.  char z
18bb0 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  Stmt[100];.  sql
18bc0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
18bd0 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65  db, "PRAGMA reve
18be0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
18bf0 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74  lects", -1, &pSt
18c00 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  mt, 0);.  if( sq
18c10 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18c20 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18c30 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20  .    iSetting = 
18c40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18c50 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
18c60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
18c70 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73  lize(pStmt);.  s
18c80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
18c90 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a  sizeof(zStmt), z
18ca0 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52  Stmt,.       "PR
18cb0 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
18cc0 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25  rdered_selects(%
18cd0 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b  d)", !iSetting);
18ce0 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
18cf0 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c  db, zStmt, 0, 0,
18d00 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
18d10 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
18d20 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
18d30 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
18d40 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
18d50 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
18d60 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
18d70 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
18d80 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
18d90 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
18da0 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
18db0 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
18dc0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
18dd0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
18de0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
18df0 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
18e00 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
18e10 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
18e20 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
18e30 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
18e40 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
18e50 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
18e60 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69  *azNotUsed){.  i
18e70 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
18e80 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
18e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
18ea0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18eb0 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61  zSql;.  ShellSta
18ec0 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
18ed0 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55  ate *)pArg;..  U
18ee0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18ef0 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  azNotUsed);.  if
18f00 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41  ( nArg!=3 || azA
18f10 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
18f20 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41  ;.  zTable = azA
18f30 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d  rg[0];.  zType =
18f40 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71   azArg[1];.  zSq
18f50 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20  l = azArg[2];.. 
18f60 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
18f70 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
18f80 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
18f90 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
18fa0 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
18fb0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
18fc0 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
18fd0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
18fe0 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
18ff0 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
19000 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
19010 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
19020 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
19030 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
19040 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c   strncmp(zTable,
19050 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
19060 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19070 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
19080 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52  trncmp(zSql, "CR
19090 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
190a0 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20  LE", 20)==0 ){. 
190b0 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20     char *zIns;. 
190c0 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61     if( !p->writa
190d0 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
190e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
190f0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
19100 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
19110 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
19120 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
19130 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
19140 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
19150 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
19160 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
19170 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
19180 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
19190 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
191a0 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
191b0 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
191c0 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
191d0 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
191e0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
191f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
19200 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
19210 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
19220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
19240 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
19250 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e  >out, zSql, ";\n
19260 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ");.  }..  if( s
19270 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
19280 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
19290 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
192a0 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  t;.    ShellText
192b0 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   sTable;.    cha
192c0 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69  r **azCol;.    i
192d0 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a  nt i;.    char *
192e0 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
192f0 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64      int savedMod
19300 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20  e;..    azCol = 
19310 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
19320 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  p, zTable);.    
19330 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
19340 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b        p->nErr++;
19350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
19370 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20  lways quote the 
19380 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e  table name, even
19390 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
193a0 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c  o be pure ascii,
193b0 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
193c0 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e  it is a keyword.
193d0 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54   Ex:  INSERT INT
193e0 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f  O "table" ... */
193f0 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
19400 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65  Table);.    appe
19410 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
19420 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
19430 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  r(zTable));.    
19440 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67  /* If preserving
19450 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20   the rowid, add 
19460 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66  a column list af
19470 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ter the table na
19480 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74  me..    ** In ot
19490 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53  her words:  "INS
194a0 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77  ERT INTO tab(row
194b0 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41  id,a,b,c,...) VA
194c0 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a  LUES(...)".    *
194d0 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
194e0 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49   usual "INSERT I
194f0 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e  NTO tab VALUES(.
19500 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19510 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19520 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19530 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20  t(&sTable, "(", 
19540 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
19550 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
19560 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
19570 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
19580 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
19590 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
195a0 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
195b0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
195c0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
195d0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
195e0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
195f0 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
19600 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29  Text(&sTable, ")
19610 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ", 0);.    }..  
19620 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70    /* Build an ap
19630 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54  propriate SELECT
19640 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
19650 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c    initText(&sSel
19660 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ect);.    append
19670 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
19680 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
19690 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
196a0 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
196b0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
196c0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
196d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
196e0 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
196f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31     }.    for(i=1
19700 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
19710 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
19720 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
19730 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
19740 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
19750 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31     if( azCol[i+1
19760 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
19770 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
19780 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
19790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
197a0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
197b0 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
197c0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46  xt(&sSelect, " F
197d0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61  ROM ", 0);.    a
197e0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
197f0 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  ct, zTable, quot
19800 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
19810 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61  .    savedDestTa
19820 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61  ble = p->zDestTa
19830 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f  ble;.    savedMo
19840 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
19850 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
19860 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20  = sTable.z;.    
19870 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f  p->mode = p->cMo
19880 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
19890 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  ;.    rc = shell
198a0 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74  _exec(p, sSelect
198b0 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  .z, 0);.    if( 
198c0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
198d0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
198e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
198f0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19900 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19910 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19920 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
19930 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
19940 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
19950 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b  , sSelect.z, 0);
19960 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
19970 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
19980 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44  .    }.    p->zD
19990 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64  estTable = saved
199a0 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70  DestTable;.    p
199b0 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f  ->mode = savedMo
199c0 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  de;.    freeText
199d0 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66  (&sTable);.    f
199e0 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74  reeText(&sSelect
199f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
19a00 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  p->nErr++;.  }. 
19a10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19a20 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20  .** Run zQuery. 
19a30 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61   Use dump_callba
19a40 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
19a50 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20  back routine so 
19a60 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  that.** the cont
19a70 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72  ents of the quer
19a80 79 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20  y are output as 
19a90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
19aa0 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  **.** If we get 
19ab0 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
19ac0 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
19ad0 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
19ae0 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
19af0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
19b00 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
19b10 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
19b20 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
19b30 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
19b40 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
19b50 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74  *zQuery.){.  int
19b60 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
19b70 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  r = 0;.  rc = sq
19b80 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19b90 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63  , zQuery, dump_c
19ba0 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
19bb0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
19bc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
19bd0 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20      char *zQ2;. 
19be0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
19bf0 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20  len30(zQuery);. 
19c00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
19c10 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19c20 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19c30 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19c40 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
19c50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19c60 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19c70 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
19c80 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  zErr);.      sql
19c90 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
19ca0 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b  .      zErr = 0;
19cb0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d  .    }.    zQ2 =
19cc0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30   malloc( len+100
19cd0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d   );.    if( zQ2=
19ce0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
19cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
19d00 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51  intf(len+100, zQ
19d10 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20  2, "%s ORDER BY 
19d20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75  rowid DESC", zQu
19d30 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ery);.    rc = s
19d40 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19d50 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c  b, zQ2, dump_cal
19d60 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19d70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
19d80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
19d90 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
19da0 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a  ** ERROR: %s ***
19db0 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
19dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19de0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
19df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
19e00 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32  r);.    free(zQ2
19e10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19e20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  rc;.}../*.** Tex
19e30 74 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67  t of help messag
19e40 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65  es..**.** The he
19e50 6c 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68  lp text for each
19e60 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d   individual comm
19e70 61 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20  and begins with 
19e80 61 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72  a line that star
19e90 74 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20  ts.** with ".". 
19ea0 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65   Subsequent line
19eb0 73 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74  s are suppliment
19ec0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19ed0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
19ee0 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   be two or more 
19ef0 73 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74  spaces between t
19f00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f  he end of the co
19f10 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a  mmand and the.**
19f20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   start of the de
19f30 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61  scription of wha
19f40 74 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64  t that command d
19f50 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  oes..*/.static c
19f60 6f 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65  onst char *(azHe
19f70 6c 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65  lp[]) = {.#if de
19f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
19f90 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
19fa0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19fb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
19fc0 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
19fd0 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
19fe0 20 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a   SQL archives",.
19ff0 20 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61    "   Each comma
1a000 6e 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  nd must have exa
1a010 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
1a020 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e  following option
1a030 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c  s:",.  "     -c,
1a040 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20   --create       
1a050 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61          Create a
1a060 20 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20   new archive",. 
1a070 20 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64   "     -u, --upd
1a080 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
1a090 20 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75    Add files or u
1a0a0 70 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68  pdate files with
1a0b0 20 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c   changed mtime",
1a0c0 0a 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69  .  "     -i, --i
1a0d0 6e 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20  nsert           
1a0e0 20 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20      Like -u but 
1a0f0 61 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20  always add even 
1a100 69 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67  if mtime unchang
1a110 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c  ed",.  "     -t,
1a120 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20   --list         
1a130 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e          List con
1a140 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65  tents of archive
1a150 22 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d  ",.  "     -x, -
1a160 2d 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20  -extract        
1a170 20 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69        Extract fi
1a180 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65  les from archive
1a190 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61  ",.  "   Optiona
1a1a0 6c 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20  l arguments:",. 
1a1b0 20 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72   "     -v, --ver
1a1c0 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  bose            
1a1d0 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c    Print each fil
1a1e0 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70  ename as it is p
1a1f0 72 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20  rocessed",.  "  
1a200 20 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69     -f FILE, --fi
1a210 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70  le FILE       Op
1a220 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65  erate on archive
1a230 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69   FILE (default i
1a240 73 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a  s current db)",.
1a250 20 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c    "     -a FILE,
1a260 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20   --append FILE  
1a270 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49     Operate on FI
1a280 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  LE opened using 
1a290 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22  the apndvfs VFS"
1a2a0 2c 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52  ,.  "     -C DIR
1a2b0 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49  , --directory DI
1a2c0 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64  R    Change to d
1a2d0 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20  irectory DIR to 
1a2e0 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c  read/extract fil
1a2f0 65 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c  es",.  "     -n,
1a300 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20   --dryrun       
1a310 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
1a320 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20   SQL that would 
1a330 68 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a  have occurred",.
1a340 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22    "   Examples:"
1a350 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63  ,.  "     .ar -c
1a360 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
1a370 6f 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20  o bar  # Create 
1a380 61 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d  archive.sar from
1a390 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62   files foo and b
1a3a0 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72  ar",.  "     .ar
1a3b0 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72   -tf archive.sar
1a3c0 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
1a3d0 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
1a3e0 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20  ive.sar",.  "   
1a3f0 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69    .ar -xvf archi
1a400 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23  ve.sar         #
1a410 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61   Verbosely extra
1a420 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
1a430 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20  chive.sar",.  " 
1a440 20 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20    See also:",.  
1a450 22 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71  "      http://sq
1a460 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d  lite.org/cli.htm
1a470 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f  l#sqlar_archive_
1a480 73 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66  support",.#endif
1a490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a4a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a4b0 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f  ON.  ".auth ON|O
1a4c0 46 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53  FF             S
1a4d0 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63  how authorizer c
1a4e0 61 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69  allbacks",.#endi
1a4f0 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  f.  ".backup ?DB
1a500 3f 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61  ? FILE        Ba
1a510 63 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74  ckup DB (default
1a520 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49   \"main\") to FI
1a530 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  LE",.  "       -
1a540 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20  -append         
1a550 20 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e     Use the appen
1a560 64 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20  dvfs",.  "      
1a570 20 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20   --async        
1a580 20 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49       Write to FI
1a590 4c 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75  LE without a jou
1a5a0 72 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74  rnal and without
1a5b0 20 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62   fsync()",.  ".b
1a5c0 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
1a5d0 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65         Stop afte
1a5e0 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72  r hitting an err
1a5f0 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  or.  Default OFF
1a600 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  ",.  ".binary on
1a610 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54  |off           T
1a620 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75  urn binary outpu
1a630 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65  t on or off.  De
1a640 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e  fault OFF",.  ".
1a650 63 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20  cd DIRECTORY    
1a660 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74          Change t
1a670 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  he working direc
1a680 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52  tory to DIRECTOR
1a690 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20  Y",.  ".changes 
1a6a0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1a6b0 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72  Show number of r
1a6c0 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53  ows changed by S
1a6d0 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47  QL",.  ".check G
1a6e0 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20  LOB             
1a6f0 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20   Fail if output 
1a700 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20  since .testcase 
1a710 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c  does not match",
1a720 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42  .  ".clone NEWDB
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1a740 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57  ne data into NEW
1a750 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73  DB from the exis
1a760 74 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  ting database",.
1a770 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20    ".databases   
1a780 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1a790 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73   names and files
1a7a0 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
1a7b0 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63  abases",.  ".dbc
1a7c0 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f  onfig ?op? ?val?
1a7d0 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61       List or cha
1a7e0 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  nge sqlite3_db_c
1a7f0 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22  onfig() options"
1a800 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ,.  ".dbinfo ?DB
1a810 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  ?             Sh
1a820 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  ow status inform
1a830 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1a840 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64  database",.  ".d
1a850 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
1a860 20 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c         Render al
1a870 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  l database conte
1a880 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20  nt as SQL",.  " 
1a890 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1a8a0 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d       --preserve-
1a8b0 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c  rowids      Incl
1a8c0 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73  ude ROWID values
1a8d0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c   in the output",
1a8e0 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69  .  "     --newli
1a8f0 6e 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  nes             
1a900 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20  Allow unescaped 
1a910 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65  newline characte
1a920 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20  rs in output",. 
1a930 20 22 20 20 20 54 41 42 4c 45 20 69 73 20 61 20   "   TABLE is a 
1a940 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72  LIKE pattern for
1a950 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64   the tables to d
1a960 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f  ump",.  ".echo o
1a970 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
1a980 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
1a990 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  cho on or off",.
1a9a0 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
1a9b0 75 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62  ull|...     Enab
1a9c0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75  le or disable au
1a9d0 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
1a9e0 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22  QUERY PLAN",.  "
1a9f0 20 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22     Other Modes:"
1aa00 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1aa10 44 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74  DEBUG.  "      t
1aa20 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1aa30 20 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58       Show raw EX
1aa40 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1aa50 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20   output",.  "   
1aa60 20 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20     trace        
1aa70 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22           Like \"
1aa80 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20  full\" but also 
1aa90 65 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20  enable \"PRAGMA 
1aaa0 76 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23  vdbe_trace\"",.#
1aab0 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74  endif.  "      t
1aac0 72 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20  rigger          
1aad0 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c       Like \"full
1aae0 5c 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77  \" but also show
1aaf0 20 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64   trigger bytecod
1ab00 65 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20  e",.  ".excel   
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70  Display the outp
1ab30 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61  ut of next comma
1ab40 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  nd in a spreadsh
1ab50 65 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f  eet",.  ".exit ?
1ab60 43 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20  CODE?           
1ab70 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
1ab80 72 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d  ram with return-
1ab90 63 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e  code CODE",.  ".
1aba0 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20  expert          
1abb0 20 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45          EXPERIME
1abc0 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e  NTAL. Suggest in
1abd0 64 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66  dexes for specif
1abe0 69 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a  ied queries",./*
1abf0 20 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e   Because explain
1ac00 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61   mode comes on a
1ac10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77  utomatically now
1ac20 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  , the ".explain"
1ac30 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f   mode.** is remo
1ac40 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c  ved from the hel
1ac50 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73  p screen.  It is
1ac60 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64   still supported
1ac70 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77   for legacy, how
1ac80 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c  ever */./*".expl
1ac90 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f  ain ?on|off|auto
1aca0 3f 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e  ?   Turn EXPLAIN
1acb0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20   output mode on 
1acc0 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74  or off or to aut
1acd0 6f 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66  omatic",*/.  ".f
1ace0 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
1acf0 65 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65  ent?   Show sche
1ad00 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ma and the conte
1ad10 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  nt of sqlite_sta
1ad20 74 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68  t tables",.  ".h
1ad30 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20  eaders on|off   
1ad40 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70         Turn disp
1ad50 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
1ad60 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68  n or off",.  ".h
1ad70 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54  elp ?-all? ?PATT
1ad80 45 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70  ERN?   Show help
1ad90 20 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52   text for PATTER
1ada0 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  N",.  ".import F
1adb0 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20  ILE TABLE       
1adc0 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
1add0 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
1ade0 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1adf0 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
1ae00 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72  ROL.  ".imposter
1ae10 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20   INDEX TABLE    
1ae20 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  Create imposter 
1ae30 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69  table TABLE on i
1ae40 6e 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e  ndex INDEX",.#en
1ae50 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20  dif.  ".indexes 
1ae60 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20  ?TABLE?         
1ae70 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e  Show names of in
1ae80 64 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20  dexes",.  "     
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69        If TABLE i
1aeb0 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  s specified, onl
1aec0 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66  y show indexes f
1aed0 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  or",.  "        
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69     tables matchi
1af00 6e 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74  ng TABLE using t
1af10 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
1af20 2e 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .",.#ifdef SQLIT
1af30 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
1af40 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c  .  ".iotrace FIL
1af50 45 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61  E            Ena
1af60 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
1af70 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
1af80 4c 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  LE",.#endif.  ".
1af90 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56  limit ?LIMIT? ?V
1afa0 41 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20  AL?     Display 
1afb0 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  or change the va
1afc0 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45  lue of an SQLITE
1afd0 5f 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e  _LIMIT",.  ".lin
1afe0 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20  t OPTIONS       
1aff0 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65       Report pote
1b000 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73  ntial schema iss
1b010 75 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f  ues.",.  "     O
1b020 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1b030 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65       fkey-indexe
1b040 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69  s     Find missi
1b050 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ng foreign key i
1b060 6e 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66  ndexes",.#ifndef
1b070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1b080 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
1b090 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
1b0a0 3f 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20  ?       Load an 
1b0b0 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72  extension librar
1b0c0 79 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  y",.#endif.  ".l
1b0d0 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20  og FILE|off     
1b0e0 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67         Turn logg
1b0f0 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  ing on or off.  
1b100 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65  FILE can be stde
1b110 72 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e  rr/stdout",.  ".
1b120 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45  mode MODE ?TABLE
1b130 3f 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70  ?       Set outp
1b140 75 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20  ut mode",.  "   
1b150 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22  MODE is one of:"
1b160 2c 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20  ,.  "     ascii 
1b170 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20     Columns/rows 
1b180 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31  delimited by 0x1
1b190 46 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22  F and 0x1E",.  "
1b1a0 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f       csv      Co
1b1b0 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61  mma-separated va
1b1c0 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63  lues",.  "     c
1b1d0 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
1b1e0 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
1b1f0 53 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20  See .width)",.  
1b200 22 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48  "     html     H
1b210 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65  TML <table> code
1b220 22 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72  ",.  "     inser
1b230 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
1b240 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
1b250 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  BLE",.  "     li
1b260 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
1b270 20 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20   per line",.  " 
1b280 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c      list     Val
1b290 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ues delimited by
1b2a0 20 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20   \"|\"",.  "    
1b2b0 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
1b2c0 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
1b2d0 53 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61  SQL",.  "     ta
1b2e0 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72  bs     Tab-separ
1b2f0 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  ated values",.  
1b300 22 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54  "     tcl      T
1b310 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
1b320 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65  ",.  ".nullvalue
1b330 20 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55   STRING        U
1b340 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61  se STRING in pla
1b350 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65  ce of NULL value
1b360 73 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65  s",.  ".once (-e
1b370 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20  |-x|FILE)       
1b380 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e  Output for the n
1b390 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  ext SQL command 
1b3a0 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20  only to FILE",. 
1b3b0 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1b3c0 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1b3d0 68 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69  hen open as a pi
1b3e0 70 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68  pe",.  "     Oth
1b3f0 65 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20  er options:",.  
1b400 22 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e  "       -e    In
1b410 76 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74  voke system text
1b420 20 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20   editor",.  "   
1b430 20 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69      -x    Open i
1b440 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
1b450 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49  ,.  ".open ?OPTI
1b460 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c  ONS? ?FILE?   Cl
1b470 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  ose existing dat
1b480 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e  abase and reopen
1b490 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1b4a0 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1b4b0 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
1b4c0 20 20 20 20 20 20 55 73 65 20 61 70 70 65 6e 64        Use append
1b4d0 76 66 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61  vfs to append da
1b4e0 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e  tabase to the en
1b4f0 64 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64  d of FILE",.#ifd
1b500 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1b510 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22  _DESERIALIZE.  "
1b520 20 20 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69          --deseri
1b530 61 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74  alize   Load int
1b540 6f 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20  o memory useing 
1b550 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c  sqlite3_deserial
1b560 69 7a 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20  ize()",.  "     
1b570 20 20 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20     --hexdb      
1b580 20 20 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70     Load the outp
1b590 75 74 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c  ut of \"dbtotxt\
1b5a0 22 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  " as an in-memor
1b5b0 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  y database",.  "
1b5c0 20 20 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a          --maxsiz
1b5d0 65 20 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20  e N     Maximum 
1b5e0 73 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62  size for --hexdb
1b5f0 20 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a   or --deserializ
1b600 65 64 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65  ed database",.#e
1b610 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 20 20  ndif.  "        
1b620 2d 2d 6e 65 77 20 20 20 20 20 20 20 20 20 20 20  --new           
1b630 49 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20  Initialize FILE 
1b640 74 6f 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61  to an empty data
1b650 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20  base",.  "      
1b660 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20    --readonly    
1b670 20 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64    Open FILE read
1b680 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20  only",.  "      
1b690 20 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20    --zip         
1b6a0 20 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20    FILE is a ZIP 
1b6b0 61 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75  archive",.  ".ou
1b6c0 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20  tput ?FILE?     
1b6d0 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1b6e0 74 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64  t to FILE or std
1b6f0 6f 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f  out if FILE is o
1b700 6d 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20  mitted",.  "    
1b710 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20   If FILE begins 
1b720 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70  with '|' then op
1b730 65 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e  en it as a pipe.
1b740 22 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74 65 72  ",.  ".parameter
1b750 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d   CMD ...       M
1b760 61 6e 61 67 65 20 53 51 4c 20 70 61 72 61 6d 65  anage SQL parame
1b770 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20  ter bindings",. 
1b780 20 22 20 20 20 63 6c 65 61 72 20 20 20 20 20 20   "   clear      
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72 61               Era
1b7a0 73 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22  se all bindings"
1b7b0 2c 0a 20 20 22 20 20 20 69 6e 69 74 20 20 20 20  ,.  "   init    
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 54  Initialize the T
1b7e0 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68  EMP table that h
1b7f0 6f 6c 64 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a  olds bindings",.
1b800 20 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20    "   list      
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1b820 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  st the current p
1b830 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67  arameter binding
1b840 73 22 2c 0a 20 20 22 20 20 20 73 65 74 20 50 41  s",.  "   set PA
1b850 52 41 4d 45 54 45 52 20 56 41 4c 55 45 20 20 20  RAMETER VALUE   
1b860 20 20 47 69 76 65 6e 20 53 51 4c 20 70 61 72 61    Given SQL para
1b870 6d 65 74 65 72 20 50 41 52 41 4d 45 54 45 52 20  meter PARAMETER 
1b880 61 20 76 61 6c 75 65 20 6f 66 20 56 41 4c 55 45  a value of VALUE
1b890 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  ",.  "          
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 50 41 52 41 4d 45 54 45 52 20 73 68 6f 75 6c   PARAMETER shoul
1b8c0 64 20 73 74 61 72 74 20 77 69 74 68 20 27 24 27  d start with '$'
1b8d0 2c 20 27 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27  , ':', '@', or '
1b8e0 3f 27 22 2c 0a 20 20 22 20 20 20 75 6e 73 65 74  ?'",.  "   unset
1b8f0 20 50 41 52 41 4d 45 54 45 52 20 20 20 20 20 20   PARAMETER      
1b900 20 20 20 52 65 6d 6f 76 65 20 50 41 52 41 4d 45     Remove PARAME
1b910 54 45 52 20 66 72 6f 6d 20 74 68 65 20 62 69 6e  TER from the bin
1b920 64 69 6e 67 20 74 61 62 6c 65 22 2c 0a 20 20 22  ding table",.  "
1b930 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e  .print STRING...
1b940 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c           Print l
1b950 69 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a  iteral STRING",.
1b960 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b970 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
1b980 4c 42 41 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65  LBACK.  ".progre
1b990 73 73 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  ss N            
1b9a0 20 20 49 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73    Invoke progres
1b9b0 73 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  s handler after 
1b9c0 65 76 65 72 79 20 4e 20 6f 70 63 6f 64 65 73 22  every N opcodes"
1b9d0 2c 0a 20 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20  ,.  "   --limit 
1b9e0 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
1b9f0 20 20 49 6e 74 65 72 72 75 70 74 20 61 66 74 65    Interrupt afte
1ba00 72 20 4e 20 70 72 6f 67 72 65 73 73 20 63 61 6c  r N progress cal
1ba10 6c 62 61 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d  lbacks",.  "   -
1ba20 2d 6f 6e 63 65 20 20 20 20 20 20 20 20 20 20 20  -once           
1ba30 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d           Do no m
1ba40 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f  ore than one pro
1ba50 67 72 65 73 73 20 69 6e 74 65 72 72 75 70 74 22  gress interrupt"
1ba60 2c 0a 20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c  ,.  "   --quiet|
1ba70 2d 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -q              
1ba80 20 20 4e 6f 20 6f 75 74 70 75 74 20 65 78 63 65    No output exce
1ba90 70 74 20 61 74 20 69 6e 74 65 72 72 75 70 74 73  pt at interrupts
1baa0 22 2c 0a 20 20 22 20 20 20 2d 2d 72 65 73 65 74  ",.  "   --reset
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 52 65 73 65 74 20 74 68 65 20 63 6f 75     Reset the cou
1bad0 6e 74 20 66 6f 72 20 65 61 63 68 20 69 6e 70 75  nt for each inpu
1bae0 74 20 61 6e 64 20 69 6e 74 65 72 72 75 70 74 22  t and interrupt"
1baf0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f  ,.#endif.  ".pro
1bb00 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
1bb10 45 20 20 20 20 52 65 70 6c 61 63 65 20 74 68 65  E    Replace the
1bb20 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
1bb30 73 22 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20  s",.  ".quit    
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
1bb60 6d 22 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  m",.  ".read FIL
1bb70 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1bb80 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1bb90 46 49 4c 45 22 2c 0a 23 69 66 20 21 64 65 66 69  FILE",.#if !defi
1bba0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bbb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
1bbc0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bbd0 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
1bbe0 41 42 29 0a 20 20 22 2e 72 65 63 6f 76 65 72 20  AB).  ".recover 
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 52 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20  Recover as much 
1bc10 64 61 74 61 20 61 73 20 70 6f 73 73 69 62 6c 65  data as possible
1bc20 20 66 72 6f 6d 20 63 6f 72 72 75 70 74 20 64 62   from corrupt db
1bc30 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 72  .",.#endif.  ".r
1bc40 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
1bc50 20 20 20 20 20 20 20 52 65 73 74 6f 72 65 20 63         Restore c
1bc60 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65  ontent of DB (de
1bc70 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
1bc80 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22 2e  from FILE",.  ".
1bc90 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20 20  save FILE       
1bca0 20 20 20 20 20 20 20 20 57 72 69 74 65 20 69 6e          Write in
1bcb0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1bcc0 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22   into FILE",.  "
1bcd0 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66  .scanstats on|of
1bce0 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 73 71  f        Turn sq
1bcf0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
1bd00 74 61 74 75 73 28 29 20 6d 65 74 72 69 63 73 20  tatus() metrics 
1bd10 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e  on or off",.  ".
1bd20 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f  schema ?PATTERN?
1bd30 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
1bd40 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
1bd50 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54 54  ts matching PATT
1bd60 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70  ERN",.  "     Op
1bd70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1bd80 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20 20 20       --indent   
1bd90 20 20 20 20 20 20 20 20 20 54 72 79 20 74 6f 20           Try to 
1bda0 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74 68 65  pretty-print the
1bdb0 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e 73 65   schema",.  ".se
1bdc0 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e 53 3f  lftest ?OPTIONS?
1bdd0 20 20 20 20 20 20 52 75 6e 20 74 65 73 74 73 20        Run tests 
1bde0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53  defined in the S
1bdf0 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c 0a  ELFTEST table",.
1be00 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22    "    Options:"
1be10 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 69 6e  ,.  "       --in
1be20 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1be30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 45   Create a new SE
1be40 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c 0a 20  LFTEST table",. 
1be50 20 22 20 20 20 20 20 20 20 2d 76 20 20 20 20 20   "       -v     
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 65                Ve
1be70 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c 0a 20  rbose output",. 
1be80 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c   ".separator COL
1be90 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61 6e 67   ?ROW?     Chang
1bea0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  e the column and
1beb0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 22   row separators"
1bec0 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ,.#if defined(SQ
1bed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1bee0 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e  ION).  ".session
1bef0 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e 2e 20   ?NAME? CMD ... 
1bf00 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72   Create or contr
1bf10 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a 20 20  ol sessions",.  
1bf20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64 73 3a  "   Subcommands:
1bf30 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74 61 63  ",.  "     attac
1bf40 68 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20  h TABLE         
1bf50 20 20 20 20 41 74 74 61 63 68 20 54 41 42 4c 45      Attach TABLE
1bf60 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61 6e 67  ",.  "     chang
1bf70 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  eset FILE       
1bf80 20 20 20 20 57 72 69 74 65 20 61 20 63 68 61 6e      Write a chan
1bf90 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22  geset into FILE"
1bfa0 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73 65 20  ,.  "     close 
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73     Close one ses
1bfd0 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20 20 65  sion",.  "     e
1bfe0 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20  nable ?BOOLEAN? 
1bff0 20 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71          Set or q
1c000 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20  uery the enable 
1c010 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20 66 69  bit",.  "     fi
1c020 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20  lter GLOB...    
1c030 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74 61         Reject ta
1c040 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47 4c  bles matching GL
1c050 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20 69 6e  OBs",.  "     in
1c060 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f  direct ?BOOLEAN?
1c070 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20 71         Mark or q
1c080 75 65 72 79 20 74 68 65 20 69 6e 64 69 72 65 63  uery the indirec
1c090 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22 20 20  t status",.  "  
1c0a0 20 20 20 69 73 65 6d 70 74 79 20 20 20 20 20 20     isempty      
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 51 75 65 72              Quer
1c0c0 79 20 77 68 65 74 68 65 72 20 74 68 65 20 73 65  y whether the se
1c0d0 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 22 2c  ssion is empty",
1c0e0 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20  .  "     list   
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79    List currently
1c110 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61   open session na
1c120 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20 6f 70  mes",.  "     op
1c130 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20  en DB NAME      
1c140 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65         Open a ne
1c150 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 22  w session on DB"
1c160 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63 68 73  ,.  "     patchs
1c170 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  et FILE         
1c180 20 20 20 57 72 69 74 65 20 61 20 70 61 74 63 68     Write a patch
1c190 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a  set into FILE",.
1c1a0 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45 3f 20    "   If ?NAME? 
1c1b0 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20  is omitted, the 
1c1c0 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 73 65  first defined se
1c1d0 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 22 2c  ssion is used.",
1c1e0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33  .#endif.  ".sha3
1c1f0 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  sum ...         
1c200 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48      Compute a SH
1c210 41 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62  A3 hash of datab
1c220 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a 20 20  ase content",.  
1c230 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a  "    Options:",.
1c240 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68 65 6d    "      --schem
1c250 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41  a              A
1c260 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73 71 6c  lso hash the sql
1c270 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1c280 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1c290 61 33 2d 32 32 34 20 20 20 20 20 20 20 20 20 20  a3-224          
1c2a0 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 32    Use the sha3-2
1c2b0 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20  24 algorithm",. 
1c2c0 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32   "      --sha3-2
1c2d0 35 36 20 20 20 20 20 20 20 20 20 20 20 20 55 73  56            Us
1c2e0 65 20 74 68 65 20 73 68 61 33 2d 32 35 36 20 61  e the sha3-256 a
1c2f0 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69 73 20  lgorithm.  This 
1c300 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 22  is the default."
1c310 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61  ,.  "      --sha
1c320 33 2d 33 38 34 20 20 20 20 20 20 20 20 20 20 20  3-384           
1c330 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 33 38   Use the sha3-38
1c340 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20  4 algorithm",.  
1c350 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 35 31  "      --sha3-51
1c360 32 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  2            Use
1c370 20 74 68 65 20 73 68 61 33 2d 35 31 32 20 61 6c   the sha3-512 al
1c380 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1c390 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67 75 6d   Any other argum
1c3a0 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20 70 61  ent is a LIKE pa
1c3b0 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c 65 73  ttern for tables
1c3c0 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66 6e 64   to hash",.#ifnd
1c3d0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
1c3e0 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68 65 6c  _SYSTEM.  ".shel
1c3f0 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20  l CMD ARGS...   
1c400 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53      Run CMD ARGS
1c410 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20  ... in a system 
1c420 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20  shell",.#endif. 
1c430 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20   ".show         
1c440 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1c450 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1c460 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73  es for various s
1c470 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e 73 74  ettings",.  ".st
1c480 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20  ats ?on|off?    
1c490 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 73        Show stats
1c4a0 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f   or turn stats o
1c4b0 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64  n or off",.#ifnd
1c4c0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
1c4d0 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79 73 74  _SYSTEM.  ".syst
1c4e0 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20  em CMD ARGS...  
1c4f0 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53      Run CMD ARGS
1c500 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20  ... in a system 
1c510 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20  shell",.#endif. 
1c520 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45   ".tables ?TABLE
1c530 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20  ?          List 
1c540 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 20  names of tables 
1c550 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61  matching LIKE pa
1c560 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a 20 20  ttern TABLE",.  
1c570 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20  ".testcase NAME 
1c580 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
1c590 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70  redirecting outp
1c5a0 75 74 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d  ut to 'testcase-
1c5b0 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22 2e 74  out.txt'",.  ".t
1c5c0 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
1c5d0 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
1c5e0 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
1c5f0 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
1c600 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65 72  onds",.  ".timer
1c610 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1c620 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65     Turn SQL time
1c630 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69  r on or off",.#i
1c640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c650 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61 63  T_TRACE.  ".trac
1c660 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20  e ?OPTIONS?     
1c670 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68 20      Output each 
1c680 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73  SQL statement as
1c690 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20 22   it is run",.  "
1c6a0 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20 20      FILE        
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64              Send
1c6c0 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 22   output to FILE"
1c6d0 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74 20  ,.  "    stdout 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
1c700 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20 20  stdout",.  "    
1c710 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20 20  stderr          
1c720 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1c730 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c 0a  put to stderr",.
1c740 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20 20    "    off      
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1c760 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22 2c  isable tracing",
1c770 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e 64  .  "    --expand
1c780 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
1c790 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61 72  Expand query par
1c7a0 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65 66  ameters",.#ifdef
1c7b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
1c7c0 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ORMALIZE.  "    
1c7d0 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20 20  --normalized    
1c7e0 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 74          Normal t
1c7f0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c800 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  s",.#endif.  "  
1c810 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20 20    --plain       
1c820 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 53            Show S
1c830 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70 75  QL as it is inpu
1c840 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74 6d  t",.  "    --stm
1c850 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c860 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d 65     Trace stateme
1c870 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53 51  nt execution (SQ
1c880 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 29  LITE_TRACE_STMT)
1c890 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f 66  ",.  "    --prof
1c8a0 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ile             
1c8b0 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65 6d    Profile statem
1c8c0 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52 41  ents (SQLITE_TRA
1c8d0 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20 20  CE_PROFILE)",.  
1c8e0 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20 20  "    --row      
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1c900 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51 4c  ce each row (SQL
1c910 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22 2c  ITE_TRACE_ROW)",
1c920 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65 20  .  "    --close 
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c940 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Trace connection
1c950 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f 54   close (SQLITE_T
1c960 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23 65  RACE_CLOSE)",.#e
1c970 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c980 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20 22  MIT_TRACE */.  "
1c990 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20  .vfsinfo ?AUX?  
1c9a0 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61           Informa
1c9b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74  tion about the t
1c9c0 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c 0a 20  op-level VFS",. 
1c9d0 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20   ".vfslist      
1c9e0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1c9f0 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46  all available VF
1ca00 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e 61 6d  Ses",.  ".vfsnam
1ca10 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  e ?AUX?         
1ca20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65    Print the name
1ca30 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61 63   of the VFS stac
1ca40 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20 4e 55  k",.  ".width NU
1ca50 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 20 20  M1 NUM2 ...     
1ca60 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
1ca70 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
1ca80 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20   mode",.  "     
1ca90 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  Negative values 
1caa0 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22 2c 0a  right-justify",.
1cab0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
1cac0 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a   help text..**.*
1cad0 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73 63 72  * zPattern descr
1cae0 69 62 65 73 20 74 68 65 20 73 65 74 20 6f 66 20  ibes the set of 
1caf0 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77 68 69  commands for whi
1cb00 63 68 20 68 65 6c 70 20 74 65 78 74 20 69 73 20  ch help text is 
1cb10 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49 66 20  provided..** If 
1cb20 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55 4c 4c  zPattern is NULL
1cb30 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20  , then show all 
1cb40 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1cb50 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d 6c 69  ly give a one-li
1cb60 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 69 6f  ne.** descriptio
1cb70 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a  n of each..**.**
1cb80 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cb90 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e 0a 2a  er of matches..*
1cba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f  /.static int sho
1cbb0 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74 2c  wHelp(FILE *out,
1cbc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1cbd0 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20 69 20  ttern){.  int i 
1cbe0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 30  = 0;.  int j = 0
1cbf0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
1cc00 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20 20 69   char *zPat;.  i
1cc10 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 0a 20  f( zPattern==0. 
1cc20 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d    || zPattern[0]
1cc30 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74 72 63  =='0'.   || strc
1cc40 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 22  mp(zPattern,"-a"
1cc50 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 63 6d  )==0.   || strcm
1cc60 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 6c 6c  p(zPattern,"-all
1cc70 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  ")==0.  ){.    /
1cc80 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61  * Show all comma
1cc90 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  nds, but only on
1cca0 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d 6d 61  e line per comma
1ccb0 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 50  nd */.    if( zP
1ccc0 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50 61 74  attern==0 ) zPat
1ccd0 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20 20 66  tern = "";.    f
1cce0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1ccf0 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b  ize(azHelp); i++
1cd00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48  ){.      if( azH
1cd10 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 7c  elp[i][0]=='.' |
1cd20 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20 29 7b  | zPattern[0] ){
1cd30 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1cd40 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1cd50 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20  , azHelp[i]);.  
1cd60 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1cd70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1cd80 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
1cd90 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  r commands that 
1cda0 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74 74 65  for which zPatte
1cdb0 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74 20 70  rn is an exact p
1cdc0 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a 50 61  refix */.    zPa
1cdd0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
1cde0 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50 61 74  ntf(".%s*", zPat
1cdf0 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  tern);.    for(i
1ce00 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1ce10 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20  azHelp); i++){. 
1ce20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ce30 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c 20 61  _strglob(zPat, a
1ce40 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b 0a  zHelp[i])==0 ){.
1ce50 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1ce60 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1ce70 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20   azHelp[i]);.   
1ce80 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20       j = i+1;.  
1ce90 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1cea0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1ceb0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b  ite3_free(zPat);
1cec0 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a 20 20  .    if( n ){.  
1ced0 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29 7b 0a      if( n==1 ){.
1cee0 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e 20          /* when 
1cef0 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20 70 72  zPattern is a pr
1cf00 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c 79 20  efix of exactly 
1cf10 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65  one command, the
1cf20 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a 20 20  n include the.  
1cf30 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c 73        ** details
1cf40 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64   of that command
1cf50 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
1cf60 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74 20 6a  egin at offset j
1cf70 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
1cf80 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  e( j<ArraySize(a
1cf90 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65  zHelp)-1 && azHe
1cfa0 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b  lp[j][0]!='.' ){
1cfb0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
1cfc0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1cfd0 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a  n", azHelp[j]);.
1cfe0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
1cff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b  .      return n;
1d010 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4c 6f  .    }.    /* Lo
1d020 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20  ok for commands 
1d030 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a 50 61  that contain zPa
1d040 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65 2e 20  ttern anywhere. 
1d050 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
1d060 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74 20 6f  te.    ** text o
1d070 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20 74  f all commands t
1d080 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  hat match. */.  
1d090 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33    zPat = sqlite3
1d0a0 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73 25 25  _mprintf("%%%s%%
1d0b0 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ", zPattern);.  
1d0c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
1d0d0 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20  aySize(azHelp); 
1d0e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1d0f0 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e  azHelp[i][0]=='.
1d100 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20  ' ) j = i;.     
1d110 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1d120 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48 65 6c  like(zPat, azHel
1d130 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p[i], 0)==0 ){. 
1d140 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1d150 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
1d160 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20  azHelp[j]);.    
1d170 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72      while( j<Arr
1d180 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31  aySize(azHelp)-1
1d190 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d 5b   && azHelp[j+1][
1d1a0 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1d1b0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1d1c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1d1d0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1d1e0 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  elp[j]);.       
1d1f0 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a   }.        i = j
1d200 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
1d210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1d230 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  at);.  }.  retur
1d240 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n n;.}../* Forwa
1d250 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
1d260 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
1d270 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74  ss_input(ShellSt
1d280 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ate *p);../*.** 
1d290 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1d2a0 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69   of file zName i
1d2b0 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1d2c0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1d2d0 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61  _malloc64().** a
1d2e0 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
1d2f0 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
1d300 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  r. The caller is
1d310 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1d320 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20   freeing.** the 
1d330 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  memory..**.** If
1d340 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74   parameter pnByt
1d350 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28  e is not NULL, (
1d360 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20  *pnByte) is set 
1d370 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1d380 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a   bytes.** read..
1d390 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e  **.** For conven
1d3a0 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72  ience, a nul-ter
1d3b0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
1d3c0 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20  always appended 
1d3d0 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64  to the data read
1d3e0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1d3f0 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  e before the buf
1d400 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  fer is returned.
1d410 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f   This byte is no
1d420 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a  t included in.**
1d430 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   the final value
1d440 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69   of (*pnByte), i
1d450 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a  f applicable..**
1d460 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
1d470 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f  rned if any erro
1d480 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1d490 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
1d4a0 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20  e of *pnByte.** 
1d4b0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
1d4c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1d4d0 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46  atic char *readF
1d4e0 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
1d4f0 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79  zName, int *pnBy
1d500 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  te){.  FILE *in 
1d510 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
1d520 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e  rb");.  long nIn
1d530 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64  ;.  size_t nRead
1d540 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a  ;.  char *pBuf;.
1d550 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
1d560 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28  turn 0;.  fseek(
1d570 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  in, 0, SEEK_END)
1d580 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28  ;.  nIn = ftell(
1d590 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e  in);.  rewind(in
1d5a0 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69  );.  pBuf = sqli
1d5b0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49  te3_malloc64( nI
1d5c0 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75  n+1 );.  if( pBu
1d5d0 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28 69  f==0 ){ fclose(i
1d5e0 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a  n); return 0; }.
1d5f0 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28    nRead = fread(
1d600 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e  pBuf, nIn, 1, in
1d610 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  );.  fclose(in);
1d620 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20  .  if( nRead!=1 
1d630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1d640 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72  ree(pBuf);.    r
1d650 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d660 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20  Buf[nIn] = 0;.  
1d670 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
1d680 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65  Byte = nIn;.  re
1d690 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69  turn pBuf;.}..#i
1d6a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d6b0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1d6c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73  ./*.** Close a s
1d6d0 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f  ingle OpenSessio
1d6e0 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c  n object and rel
1d6f0 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  ease all of its 
1d700 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65  associated.** re
1d710 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  sources..*/.stat
1d720 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
1d730 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f  close(OpenSessio
1d740 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20  n *pSession){.  
1d750 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
1d760 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70  session_delete(p
1d770 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73  Session->p);.  s
1d780 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1d790 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  sion->zName);.  
1d7a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73  for(i=0; i<pSess
1d7b0 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b  ion->nFilter; i+
1d7c0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
1d7d0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
1d7e0 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d  zFilter[i]);.  }
1d7f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1d800 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1d810 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53  er);.  memset(pS
1d820 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f  ession, 0, sizeo
1d830 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b  f(OpenSession));
1d840 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d850 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53   Close all OpenS
1d860 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61  ession objects a
1d870 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61  nd release all a
1d880 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72  ssociated resour
1d890 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ces..*/.#if defi
1d8a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d8b0 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
1d8c0 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
1d8d0 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74  lose_all(ShellSt
1d8e0 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ate *p){.  int i
1d8f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d900 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29  ->nSession; i++)
1d910 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c  {.    session_cl
1d920 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e  ose(&p->aSession
1d930 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  [i]);.  }.  p->n
1d940 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23  Session = 0;.}.#
1d950 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
1d960 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
1d970 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1d980 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1d990 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66  of the xFilter f
1d9a0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f  unction for an o
1d9b0 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d  pen session.  Om
1d9c0 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73  it.** any tables
1d9d0 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73   named by ".sess
1d9e0 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20  ion filter" but 
1d9f0 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  let all other ta
1da00 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  ble through..*/.
1da10 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1da20 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1da30 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  N).static int se
1da40 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69  ssion_filter(voi
1da50 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63  d *pCtx, const c
1da60 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70  har *zTab){.  Op
1da70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
1da80 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69  ion = (OpenSessi
1da90 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  on*)pCtx;.  int 
1daa0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1dab0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
1dac0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
1dad0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1dae0 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1daf0 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30  ter[i], zTab)==0
1db00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1db10 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1db20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
1db30 20 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74   to deduce the t
1db40 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20  ype of file for 
1db50 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69  zName based on i
1db60 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74  ts content.  Ret
1db70 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  urn.** one of th
1db80 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63  e SHELL_OPEN_* c
1db90 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  onstants..**.** 
1dba0 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
1dbb0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73   not exist or is
1dbc0 20 65 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e   empty but its n
1dbd0 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61  ame looks like a
1dbe0 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20   ZIP.** archive 
1dbf0 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20  and the dfltZip 
1dc00 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
1dc10 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  en assume it is 
1dc20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a  a ZIP archive..*
1dc30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
1dc40 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  ume an ordinary 
1dc50 64 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c  database regardl
1dc60 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  ess of the filen
1dc70 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79  ame if.** the ty
1dc80 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74  pe cannot be det
1dc90 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e  ermined from con
1dca0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64  tent..*/.int ded
1dcb0 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1dcc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1dcd0 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29 7b  e, int dfltZip){
1dce0 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70  .  FILE *f = fop
1dcf0 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1dd00 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69  .  size_t n;.  i
1dd10 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50  nt rc = SHELL_OP
1dd20 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61  EN_UNSPEC;.  cha
1dd30 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
1dd40 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( f==0 ){.    i
1dd50 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  f( dfltZip && sq
1dd60 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1dd70 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1dd80 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75  0 ){.       retu
1dd90 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  rn SHELL_OPEN_ZI
1dda0 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65  PFILE;.    }else
1ddb0 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  {.       return 
1ddc0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1ddd0 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  L;.    }.  }.  n
1dde0 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31   = fread(zBuf, 1
1ddf0 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20  6, 1, f);.  if( 
1de00 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==1 && memcmp(z
1de10 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f 72  Buf, "SQLite for
1de20 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20 29  mat 3", 16)==0 )
1de30 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29 3b  {.    fclose(f);
1de40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c  .    return SHEL
1de50 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1de60 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32   }.  fseek(f, -2
1de70 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  5, SEEK_END);.  
1de80 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1de90 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28  25, 1, f);.  if(
1dea0 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28   n==1 && memcmp(
1deb0 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d  zBuf, "Start-Of-
1dec0 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d  SQLite3-", 17)==
1ded0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48  0 ){.    rc = SH
1dee0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
1def0 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FS;.  }else{.   
1df00 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53   fseek(f, -22, S
1df10 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20  EEK_END);.    n 
1df20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32  = fread(zBuf, 22
1df30 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28  , 1, f);.    if(
1df40 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d   n==1 && zBuf[0]
1df50 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31  ==0x50 && zBuf[1
1df60 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b  ]==0x4b && zBuf[
1df70 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20  2]==0x05.       
1df80 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36  && zBuf[3]==0x06
1df90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1dfa0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1dfb0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
1dfc0 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69 70   n==0 && dfltZip
1dfd0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1dfe0 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1dff0 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1e000 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
1e010 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a  _ZIPFILE;.    }.
1e020 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b    }.  fclose(f);
1e030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
1e040 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e050 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
1e060 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6e 73  IZE./*.** Recons
1e070 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  truct an in-memo
1e080 72 79 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  ry database usin
1e090 67 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f  g the output fro
1e0a0 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74 22 0a  m the "dbtotxt".
1e0b0 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52 65 61  ** program.  Rea
1e0c0 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e0d0 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e 7a 44  he file in p->zD
1e0e0 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66 20 70  bFilename.  If p
1e0f0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a 2a 2a  ->zDbFilename.**
1e100 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65 61 64   is 0, then read
1e110 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69   from standard i
1e120 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nput..*/.static 
1e130 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
1e140 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c 53 74  eadHexDb(ShellSt
1e150 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 44  ate *p, int *pnD
1e160 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ata){.  unsigned
1e170 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a 20 20   char *a = 0;.  
1e180 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74  int nLine;.  int
1e190 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67   n = 0;.  int pg
1e1a0 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  sz = 0;.  int iO
1e1b0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  ffset = 0;.  int
1e1c0 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63 3b   j, k;.  int rc;
1e1d0 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 75  .  FILE *in;.  u
1e1e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 5b 31 36  nsigned int x[16
1e1f0 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  ];.  char zLine[
1e200 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 70 2d 3e  1000];.  if( p->
1e210 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  zDbFilename ){. 
1e220 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 70 2d     in = fopen(p-
1e230 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 22 72  >zDbFilename, "r
1e240 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
1e250 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
1e260 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1e270 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
1e280 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 5c 6e  \" for reading\n
1e290 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  ", p->zDbFilenam
1e2a0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1e2b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4c   0;.    }.    nL
1e2c0 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
1e2d0 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d 3e 69 6e  {.    in = p->in
1e2e0 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 70 2d  ;.    nLine = p-
1e2f0 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 69 66 28  >lineno;.    if(
1e300 20 69 6e 3d 3d 30 20 29 20 69 6e 20 3d 20 73 74   in==0 ) in = st
1e310 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61  din;.  }.  *pnDa
1e320 74 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b  ta = 0;.  nLine+
1e330 2b 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a  +;.  if( fgets(z
1e340 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
1e350 6e 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f  ne), in)==0 ) go
1e360 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e370 6f 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e  or;.  rc = sscan
1e380 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65  f(zLine, "| size
1e390 20 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22   %d pagesize %d"
1e3a0 2c 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20  , &n, &pgsz);.  
1e3b0 69 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f  if( rc!=2 ) goto
1e3c0 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e3d0 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 67 6f  ;.  if( n<0 ) go
1e3e0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e3f0 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65  or;.  a = sqlite
1e400 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 3f 20 6e 20  3_malloc( n ? n 
1e410 3a 20 31 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d  : 1 );.  if( a==
1e420 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
1e430 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75  intf(stderr, "Ou
1e440 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29  t of memory!\n")
1e450 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e460 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e470 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e    memset(a, 0, n
1e480 29 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31  );.  if( pgsz<51
1e490 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20  2 || pgsz>65536 
1e4a0 7c 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a  || (pgsz & (pgsz
1e4b0 2d 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75  -1))!=0 ){.    u
1e4c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e4d0 72 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  r, "invalid page
1e4e0 73 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  size\n");.    go
1e4f0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e500 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c  or;.  }.  for(nL
1e510 69 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a 4c 69  ine++; fgets(zLi
1e520 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e530 29 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65  ), in)!=0; nLine
1e540 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73  ++){.    rc = ss
1e550 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70  canf(zLine, "| p
1e560 61 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64  age %d offset %d
1e570 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20  ", &j, &k);.    
1e580 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20  if( rc==2 ){.   
1e590 20 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a     iOffset = k;.
1e5a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e5b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
1e5c0 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20  rncmp(zLine, "| 
1e5d0 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  end ", 6)==0 ){.
1e5e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e5f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61   }.    rc = ssca
1e600 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20  nf(zLine,"| %d: 
1e610 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e620 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e630 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 22   %x %x %x %x %x"
1e640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e650 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b    &j, &x[0], &x[
1e660 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d  1], &x[2], &x[3]
1e670 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20  , &x[4], &x[5], 
1e680 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20  &x[6], &x[7],.  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78                &x
1e6a0 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31  [8], &x[9], &x[1
1e6b0 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31  0], &x[11], &x[1
1e6c0 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31  2], &x[13], &x[1
1e6d0 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20  4], &x[15]);.   
1e6e0 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20   if( rc==17 ){. 
1e6f0 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74       k = iOffset
1e700 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b  +j;.      if( k+
1e710 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  16<=n ){.       
1e720 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1e730 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36   for(ii=0; ii<16
1e740 3b 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20  ; ii++) a[k+ii] 
1e750 3d 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20  = x[ii]&0xff;.  
1e760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e770 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b 0a 20    *pnData = n;. 
1e780 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29   if( in!=p->in )
1e790 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1e7a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e7b0 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65  ->lineno = nLine
1e7c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1e7d0 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72 72  ;..readHexDb_err
1e7e0 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 70 2d  or:.  if( in!=p-
1e7f0 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  >in ){.    fclos
1e800 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
1e810 20 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73      while( fgets
1e820 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1e830 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21 3d 30  Line), p->in)!=0
1e840 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b   ){.      nLine+
1e850 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74 72 6e  +;.      if(strn
1e860 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e  cmp(zLine, "| en
1e870 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62 72 65  d ", 6)==0 ) bre
1e880 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ak;.    }.    p-
1e890 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65 3b  >lineno = nLine;
1e8a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1e8b0 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38 5f 70  ree(a);.  utf8_p
1e8c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
1e8d0 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f  ror on line %d o
1e8e0 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75 74 5c  f --hexdb input\
1e8f0 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 72 65  n", nLine);.  re
1e900 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1e910 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1e920 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f  E_DESERIALIZE */
1e930 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66  ../*.** Scalar f
1e940 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 69  unction "shell_i
1e950 6e 74 33 32 22 2e 20 54 68 65 20 66 69 72 73 74  nt32". The first
1e960 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1e970 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
1e980 73 74 20 62 65 20 61 20 62 6c 6f 62 2e 20 54 68  st be a blob. Th
1e990 65 20 73 65 63 6f 6e 64 20 61 20 6e 6f 6e 2d 6e  e second a non-n
1e9a0 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
1e9b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
1e9c0 2a 20 72 65 61 64 73 20 61 6e 64 20 72 65 74 75  * reads and retu
1e9d0 72 6e 73 20 61 20 33 32 2d 62 69 74 20 62 69 67  rns a 32-bit big
1e9e0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1e9f0 66 72 6f 6d 20 62 79 74 65 0a 2a 2a 20 6f 66 66  from byte.** off
1ea00 73 65 74 20 28 34 2a 3c 61 72 67 32 3e 29 20 6f  set (4*<arg2>) o
1ea10 66 20 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f 0a 73  f the blob..*/.s
1ea20 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
1ea30 49 6e 74 33 32 28 0a 20 20 73 71 6c 69 74 65 33  Int32(.  sqlite3
1ea40 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1ea50 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
1ea60 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1ea70 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
1ea80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ea90 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
1eaa0 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 49 6e 74  Blob;.  int iInt
1eab0 3b 0a 20 20 0a 20 20 6e 42 6c 6f 62 20 3d 20 73  ;.  .  nBlob = s
1eac0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1ead0 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70  es(argv[0]);.  p
1eae0 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Blob = (const un
1eaf0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73 71 6c  signed char*)sql
1eb00 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
1eb10 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49 6e 74  argv[0]);.  iInt
1eb20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1eb30 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  _int(argv[1]);..
1eb40 20 20 69 66 28 20 69 49 6e 74 3e 3d 30 20 26 26    if( iInt>=0 &&
1eb50 20 28 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e 42 6c   (iInt+1)*4<=nBl
1eb60 6f 62 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ob ){.    const 
1eb70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1eb80 20 3d 20 26 70 42 6c 6f 62 5b 69 49 6e 74 2a 34   = &pBlob[iInt*4
1eb90 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ];.    sqlite3_i
1eba0 6e 74 36 34 20 69 56 61 6c 20 3d 20 28 28 73 71  nt64 iVal = ((sq
1ebb0 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 30 5d  lite3_int64)a[0]
1ebc0 3c 3c 32 34 29 0a 20 20 20 20 20 20 20 20 20 20  <<24).          
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
1ebe0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61  (sqlite3_int64)a
1ebf0 5b 31 5d 3c 3c 31 36 29 0a 20 20 20 20 20 20 20  [1]<<16).       
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  + ((sqlite3_int6
1ec20 34 29 61 5b 32 5d 3c 3c 20 38 29 0a 20 20 20 20  4)a[2]<< 8).    
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69     + ((sqlite3_i
1ec50 6e 74 36 34 29 61 5b 33 5d 3c 3c 20 30 29 3b 0a  nt64)a[3]<< 0);.
1ec60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1ec70 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
1ec80 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  , iVal);.  }.}..
1ec90 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e  /*.** Scalar fun
1eca0 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 65 73 63  ction "shell_esc
1ecb0 61 70 65 5f 63 72 6e 6c 22 20 75 73 65 64 20 62  ape_crnl" used b
1ecc0 79 20 74 68 65 20 2e 72 65 63 6f 76 65 72 20 63  y the .recover c
1ecd0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 54 68 65 20 61  ommand..** The a
1ece0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1ecf0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1ed00 69 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  is the output of
1ed10 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 66 75 6e   built-in.** fun
1ed20 63 74 69 6f 6e 20 71 75 6f 74 65 28 29 2e 20 49  ction quote(). I
1ed30 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
1ed40 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
1ed50 75 74 20 69 73 20 22 27 22 2c 20 0a 2a 2a 20 69  ut is "'", .** i
1ed60 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
1ed70 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
1ed80 74 6f 20 71 75 6f 74 65 28 29 20 77 61 73 20 61  to quote() was a
1ed90 20 74 65 78 74 20 76 61 6c 75 65 2c 0a 2a 2a 20   text value,.** 
1eda0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1edb0 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
1edc0 69 6e 70 75 74 20 66 6f 72 20 22 5c 6e 22 20 61  input for "\n" a
1edd0 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74 65  nd "\r" characte
1ede0 72 73 0a 2a 2a 20 61 6e 64 20 61 64 64 73 20 61  rs.** and adds a
1edf0 20 77 72 61 70 70 65 72 20 73 69 6d 69 6c 61 72   wrapper similar
1ee00 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1ee10 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 65 70 6c 61  g:.**.**   repla
1ee20 63 65 28 72 65 70 6c 61 63 65 28 3c 69 6e 70 75  ce(replace(<inpu
1ee30 74 3e 2c 20 27 5c 6e 27 2c 20 63 68 61 72 28 31  t>, '\n', char(1
1ee40 30 29 2c 20 27 5c 72 27 2c 20 63 68 61 72 28 31  0), '\r', char(1
1ee50 33 29 29 3b 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  3));.**.** Or, i
1ee60 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
1ee70 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
1ee80 75 74 20 69 73 20 6e 6f 74 20 22 27 22 2c 20 74  ut is not "'", t
1ee90 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  hen a copy.** of
1eea0 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 72 65   the input is re
1eeb0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1eec0 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 73 63 61  c void shellEsca
1eed0 70 65 43 72 6e 6c 28 0a 20 20 73 71 6c 69 74 65  peCrnl(.  sqlite
1eee0 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1eef0 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
1ef00 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
1ef10 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1ef20 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
1ef30 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1ef40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1ef50 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
1ef60 28 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 5c 27 27  ( zText[0]=='\''
1ef70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65 78   ){.    int nTex
1ef80 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
1ef90 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1efa0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1efb0 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 3b   char zBuf1[20];
1efc0 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 32 5b  .    char zBuf2[
1efd0 32 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  20];.    const c
1efe0 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20  har *zNL = 0;.  
1eff0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1f000 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  R = 0;.    int n
1f010 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  CR = 0;.    int 
1f020 6e 4e 4c 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f  nNL = 0;..    fo
1f030 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d 3b  r(i=0; zText[i];
1f040 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1f050 20 7a 4e 4c 3d 3d 30 20 26 26 20 7a 54 65 78 74   zNL==0 && zText
1f060 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  [i]=='\n' ){.   
1f070 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
1f080 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74 2c 20  d_string(zText, 
1f090 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20  "\\n", "\\012", 
1f0a0 7a 42 75 66 31 29 3b 0a 20 20 20 20 20 20 20 20  zBuf1);.        
1f0b0 6e 4e 4c 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  nNL = (int)strle
1f0c0 6e 28 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  n(zNL);.      }.
1f0d0 20 20 20 20 20 20 69 66 28 20 7a 43 52 3d 3d 30        if( zCR==0
1f0e0 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c   && zText[i]=='\
1f0f0 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  r' ){.        zC
1f100 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e  R = unused_strin
1f110 67 28 7a 54 65 78 74 2c 20 22 5c 5c 72 22 2c 20  g(zText, "\\r", 
1f120 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
1f130 0a 20 20 20 20 20 20 20 20 6e 43 52 20 3d 20 28  .        nCR = (
1f140 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 52 29 3b  int)strlen(zCR);
1f150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f160 20 20 20 20 69 66 28 20 7a 4e 4c 20 7c 7c 20 7a      if( zNL || z
1f170 43 52 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CR ){.      int 
1f180 69 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  iOut = 0;.      
1f190 69 36 34 20 6e 4d 61 78 20 3d 20 28 6e 4e 4c 20  i64 nMax = (nNL 
1f1a0 3e 20 6e 43 52 29 20 3f 20 6e 4e 4c 20 3a 20 6e  > nCR) ? nNL : n
1f1b0 43 52 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 41  CR;.      i64 nA
1f1c0 6c 6c 6f 63 20 3d 20 6e 4d 61 78 20 2a 20 6e 54  lloc = nMax * nT
1f1d0 65 78 74 20 2b 20 28 6e 4d 61 78 2b 36 34 29 2a  ext + (nMax+64)*
1f1e0 32 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  2;.      char *z
1f1f0 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Out = (char*)sql
1f200 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
1f210 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
1f220 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
1f230 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1f240 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
1f250 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
1f260 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1f270 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c 20  ..      if( zNL 
1f280 26 26 20 7a 43 52 20 29 7b 0a 20 20 20 20 20 20  && zCR ){.      
1f290 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f2a0 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65 28 72  Out], "replace(r
1f2b0 65 70 6c 61 63 65 28 22 2c 20 31 36 29 3b 0a 20  eplace(", 16);. 
1f2c0 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 31         iOut += 1
1f2d0 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  6;.      }else{.
1f2e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f2f0 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72 65 70  zOut[iOut], "rep
1f300 6c 61 63 65 28 22 2c 20 38 29 3b 0a 20 20 20 20  lace(", 8);.    
1f310 20 20 20 20 69 4f 75 74 20 2b 3d 20 38 3b 0a 20      iOut += 8;. 
1f320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1f330 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d 3b 20  (i=0; zText[i]; 
1f340 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1f350 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e 27  ( zText[i]=='\n'
1f360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1f370 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f380 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 0a 20 20 20  , zNL, nNL);.   
1f390 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 6e         iOut += n
1f3a0 4e 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  NL;.        }els
1f3b0 65 20 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d 3d  e if( zText[i]==
1f3c0 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f3d0 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f3e0 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52 29 3b  Out], zCR, nCR);
1f3f0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75 74 20  .          iOut 
1f400 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20 20 20  += nCR;.        
1f410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f420 20 7a 4f 75 74 5b 69 4f 75 74 5d 20 3d 20 7a 54   zOut[iOut] = zT
1f430 65 78 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ext[i];.        
1f440 20 20 69 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20    iOut++;.      
1f450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1f460 20 20 20 69 66 28 20 7a 4e 4c 20 29 7b 0a 20 20     if( zNL ){.  
1f470 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
1f480 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22 2c 20  ut[iOut], ",'", 
1f490 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20  2); iOut += 2;. 
1f4a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
1f4b0 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20  Out[iOut], zNL, 
1f4c0 6e 4e 4c 29 3b 20 69 4f 75 74 20 2b 3d 20 6e 4e  nNL); iOut += nN
1f4d0 4c 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  L;.        memcp
1f4e0 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22  y(&zOut[iOut], "
1f4f0 27 2c 20 63 68 61 72 28 31 30 29 29 22 2c 20 31  ', char(10))", 1
1f500 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32 3b 0a  2); iOut += 12;.
1f510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f520 28 20 7a 43 52 20 29 7b 0a 20 20 20 20 20 20 20  ( zCR ){.       
1f530 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1f540 75 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b 20 69  ut], ",'", 2); i
1f550 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Out += 2;.      
1f560 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f570 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52 29 3b  Out], zCR, nCR);
1f580 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a 20 20   iOut += nCR;.  
1f590 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
1f5a0 75 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20 63 68  ut[iOut], "', ch
1f5b0 61 72 28 31 33 29 29 22 2c 20 31 32 29 3b 20 69  ar(13))", 12); i
1f5c0 4f 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20 20 20  Out += 12;.     
1f5d0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
1f5e0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1f5f0 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 69 4f 75  ntext, zOut, iOu
1f600 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  t, SQLITE_TRANSI
1f610 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ENT);.      sqli
1f620 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
1f630 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1f640 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
1f650 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
1f660 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
1f670 29 3b 0a 7d 0a 0a 2f 2a 20 46 6c 61 67 73 20 66  );.}../* Flags f
1f680 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a 2a 2a  or open_db()..**
1f690 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1f6a0 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70 65 6e  behavior of open
1f6b0 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78 69 74  _db() is to exit
1f6c0 28 31 29 20 69 66 20 74 68 65 20 64 61 74 61 62  (1) if the datab
1f6d0 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a 2a 20  ase fails to.** 
1f6e0 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45 4e 5f  open.  The OPEN_
1f6f0 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66 6c 61  DB_KEEPALIVE fla
1f700 67 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 73  g changes that s
1f710 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e 74 73  o that it prints
1f720 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62 75 74   an error.** but
1f730 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73 20 77   still returns w
1f740 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 65  ithout calling e
1f750 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  xit..**.** The O
1f760 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 66  PEN_DB_ZIPFILE f
1f770 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65 6e 5f  lag causes open_
1f780 64 62 28 29 20 74 6f 20 70 72 65 66 65 72 20 74  db() to prefer t
1f790 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61 73 20  o open files as 
1f7a0 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69 76 65  a.** ZIP archive
1f7b0 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
1f7c0 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69  s not exist or i
1f7d0 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74 73 20  s empty and its 
1f7e0 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a 2a 20  name matches.** 
1f7f0 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74 65 72  the *.zip patter
1f800 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50  n..*/.#define OP
1f810 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
1f820 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52 65 74    0x001   /* Ret
1f830 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f 72 20  urn after error 
1f840 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65 66 69  if true */.#defi
1f850 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49  ne OPEN_DB_ZIPFI
1f860 4c 45 20 20 20 20 20 30 78 30 30 32 20 20 20 2f  LE     0x002   /
1f870 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20 69 66  * Open as ZIP if
1f880 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 2a 2e   name matches *.
1f890 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  zip */../*.** Ma
1f8a0 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
1f8b0 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49  base is open.  I
1f8c0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1f8d0 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a  n open it.  If.*
1f8e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1f8f0 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72  ails to open, pr
1f900 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
1f910 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a  sage and exit..*
1f920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70  /.static void op
1f930 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65  en_db(ShellState
1f940 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46 6c 61   *p, int openFla
1f950 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  gs){.  if( p->db
1f960 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1f970 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
1f980 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 29 7b  L_OPEN_UNSPEC ){
1f990 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  .      if( p->zD
1f9a0 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  bFilename==0 || 
1f9b0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 5b 30  p->zDbFilename[0
1f9c0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
1f9d0 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
1f9e0 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b  ELL_OPEN_NORMAL;
1f9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fa00 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
1fa10 65 20 3d 20 28 75 38 29 64 65 64 75 63 65 44 61  e = (u8)deduceDa
1fa20 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e 7a 44  tabaseType(p->zD
1fa30 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  bFilename, .    
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e 46 6c           (openFl
1fa60 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 5a 49  ags & OPEN_DB_ZI
1fa70 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20 20 20  PFILE)!=0);.    
1fa80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 77    }.    }.    sw
1fa90 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64  itch( p->openMod
1faa0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
1fab0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
1fac0 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20 20 20  DVFS: {.        
1fad0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1fae0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1faf0 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  &p->db, .       
1fb00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1fb10 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1fb20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 22 61  _OPEN_CREATE, "a
1fb30 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20 20 20  pndvfs");.      
1fb40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fb50 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1fb60 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a 20 20  L_OPEN_HEXDB:.  
1fb70 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1fb80 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a  PEN_DESERIALIZE:
1fb90 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1fba0 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d 3e 64  e3_open(0, &p->d
1fbb0 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  b);.        brea
1fbc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1fbd0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1fbe0 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _ZIPFILE: {.    
1fbf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
1fc00 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d  (":memory:", &p-
1fc10 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1fc20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fc30 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1fc40 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20  EN_READONLY: {. 
1fc50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
1fc60 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c  pen_v2(p->zDbFil
1fc70 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53  ename, &p->db, S
1fc80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1fc90 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  NLY, 0);.       
1fca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fcb0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1fcc0 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20  _OPEN_UNSPEC:.  
1fcd0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1fce0 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20  PEN_NORMAL: {.  
1fcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1fd00 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  en(p->zDbFilenam
1fd10 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  e, &p->db);.    
1fd20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fd30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f   }.    }.    glo
1fd40 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  balDb = p->db;. 
1fd50 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
1fd60 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
1fd70 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
1fd80 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74  >db) ){.      ut
1fd90 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1fda0 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
1fdb0 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
1fdc0 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a   \"%s\": %s\n",.
1fdd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62            p->zDb
1fde0 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
1fdf0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
1fe00 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e  ;.      if( open
1fe10 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
1fe20 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20 20 20  KEEPALIVE ){.   
1fe30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1fe40 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70  n(":memory:", &p
1fe50 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 72  ->db);.        r
1fe60 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1fe70 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
1fe80 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1fe90 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1fea0 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74  ENSION.    sqlit
1feb0 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
1fec0 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
1fed0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  1);.#endif.    s
1fee0 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
1fef0 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1ff00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61  .    sqlite3_sha
1ff10 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62  three_init(p->db
1ff20 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1ff30 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  ite3_completion_
1ff40 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1ff50 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
1ff60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1ff70 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
1ff80 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1ff90 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a  LE_DBPAGE_VTAB).
1ffa0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 64 61      sqlite3_dbda
1ffb0 74 61 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ta_init(p->db, 0
1ffc0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  , 0);.#endif.#if
1ffd0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
1ffe0 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33  ZLIB.    sqlite3
1fff0 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d  _zipfile_init(p-
20000 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
20010 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e  sqlite3_sqlar_in
20020 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
20030 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
20040 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20050 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
20060 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33  l_add_schema", 3
20070 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
20080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
200a0 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65  ellAddSchemaName
200b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
200c0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
200d0 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
200e0 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
200f0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
20100 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68    shellModuleSch
20130 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ema, 0, 0);.    
20140 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20150 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
20160 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
20170 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
20180 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
201a0 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20  ellPutsFunc, 0, 
201b0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
201c0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
201d0 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 65 73  p->db, "shell_es
201e0 63 61 70 65 5f 63 72 6e 6c 22 2c 20 31 2c 20 53  cape_crnl", 1, S
201f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20210 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
20220 45 73 63 61 70 65 43 72 6e 6c 2c 20 30 2c 20 30  EscapeCrnl, 0, 0
20230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20240 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20250 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 69 6e 74  ->db, "shell_int
20260 33 32 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  32", 2, SQLITE_U
20270 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20290 20 20 20 20 73 68 65 6c 6c 49 6e 74 33 32 2c 20      shellInt32, 
202a0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
202b0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
202c0 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  TEM.    sqlite3_
202d0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
202e0 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31  p->db, "edit", 1
202f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
20300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
20320 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  itFunc, 0, 0);. 
20330 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20340 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20350 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c  , "edit", 2, SQL
20360 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e           editFun
20390 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  c, 0, 0);.#endif
203a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
203b0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
203c0 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
203d0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
203e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
203f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
20400 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
20410 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
20420 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
20430 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
20440 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
20450 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
20460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20470 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
20480 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20490 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
204a0 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  IZE.    else.   
204b0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
204c0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  ==SHELL_OPEN_DES
204d0 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f  ERIALIZE || p->o
204e0 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
204f0 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20  PEN_HEXDB ){.   
20500 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
20510 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a   int nData = 0;.
20520 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
20530 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 20 20  har *aData;.    
20540 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
20550 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  e==SHELL_OPEN_DE
20560 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20  SERIALIZE ){.   
20570 20 20 20 20 20 61 44 61 74 61 20 3d 20 28 75 6e       aData = (un
20580 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72 65 61  signed char*)rea
20590 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65  dFile(p->zDbFile
205a0 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20  name, &nData);. 
205b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
205c0 20 20 20 20 61 44 61 74 61 20 3d 20 72 65 61 64      aData = read
205d0 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74 61 29  HexDb(p, &nData)
205e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  ;.        if( aD
205f0 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
20600 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
20610 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20630 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e  _deserialize(p->
20640 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74  db, "main", aDat
20650 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c  a, nData, nData,
20660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20670 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
20680 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
20690 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
206a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
206b0 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e  SERIALIZE_FREEON
206c0 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66  CLOSE);.      if
206d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
206e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
206f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20700 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
20710 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
20720 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
20730 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78      if( p->szMax
20740 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
20750 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
20760 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
20770 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
20780 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73  IZE_LIMIT, &p->s
20790 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMax);.      }. 
207a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
207b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
207c0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
207d0 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f  tabaes connectio
207e0 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72  n.  Report error
207f0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65  s..*/.void close
20800 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _db(sqlite3 *db)
20810 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
20820 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
20830 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20840 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20850 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20860 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75  te3_close() retu
20870 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20  rns %d: %s\n",. 
20880 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74         rc, sqlit
20890 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
208a0 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45    } .}..#if HAVE
208b0 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56  _READLINE || HAV
208c0 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a  E_EDITLINE./*.**
208d0 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65   Readline comple
208e0 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a  tion callbacks.*
208f0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
20900 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
20910 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e  on_generator(con
20920 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69  st char *text, i
20930 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61  nt state){.  sta
20940 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  tic sqlite3_stmt
20950 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
20960 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28  har *zRet;.  if(
20970 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20   state==0 ){.   
20980 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
20990 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
209a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
209b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
209c0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
209d0 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
209e0 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
20a10 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
20a20 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74  ) ORDER BY 1", t
20a30 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
20a40 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
20a50 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
20a60 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
20a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
20a80 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ql);.  }.  if( s
20a90 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
20aa0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
20ab0 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72  {.    zRet = str
20ac0 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  dup((const char*
20ad0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
20ae0 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
20af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
20b00 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20b10 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
20b20 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d   = 0;.    zRet =
20b30 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20b40 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20   zRet;.}.static 
20b50 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f  char **readline_
20b60 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
20b70 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
20b80 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
20b90 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70  nd){.  rl_attemp
20ba0 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f  ted_completion_o
20bb0 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ver = 1;.  retur
20bc0 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  n rl_completion_
20bd0 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72  matches(zText, r
20be0 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
20bf0 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d  on_generator);.}
20c00 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e  ..#elif HAVE_LIN
20c10 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e  ENOISE./*.** Lin
20c20 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f  enoise completio
20c30 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  n callback.*/.st
20c40 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f  atic void lineno
20c50 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63  ise_completion(c
20c60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65  onst char *zLine
20c70 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c  , linenoiseCompl
20c80 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69  etions *lc){.  i
20c90 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65  nt nLine = strle
20ca0 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e  n30(zLine);.  in
20cb0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73  t i, iStart;.  s
20cc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
20cd0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
20ce0 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75  zSql;.  char zBu
20cf0 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20  f[1000];..  if( 
20d00 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75  nLine>sizeof(zBu
20d10 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a  f)-30 ) return;.
20d20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
20d30 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d  '.' || zLine[0]=
20d40 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20  ='#') return;.  
20d50 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69  for(i=nLine-1; i
20d60 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  >=0 && (isalnum(
20d70 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69  zLine[i]) || zLi
20d80 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d  ne[i]=='_'); i--
20d90 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69  ){}.  if( i==nLi
20da0 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  ne-1 ) return;. 
20db0 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20   iStart = i+1;. 
20dc0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c   memcpy(zBuf, zL
20dd0 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ine, iStart);.  
20de0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
20df0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
20e00 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
20e10 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
20e20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
20e30 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
20e40 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
20e50 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  ,%Q) ORDER BY 1"
20e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e70 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e             &zLin
20e80 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65  e[iStart], zLine
20e90 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  );.  sqlite3_pre
20ea0 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62  pare_v2(globalDb
20eb0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
20ec0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
20ed0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
20ee0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
20ef0 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70  balDb, "PRAGMA p
20f00 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30  age_count", 0, 0
20f10 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68  , 0); /* Load th
20f20 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68  e schema */.  wh
20f30 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
20f40 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
20f50 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
20f60 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74  t char *zComplet
20f70 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ion = (const cha
20f80 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
20f90 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
20fa0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c  ;.    int nCompl
20fb0 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  etion = sqlite3_
20fc0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
20fd0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
20fe0 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69  iStart+nCompleti
20ff0 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  on < sizeof(zBuf
21000 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-1 ){.      mem
21010 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c  cpy(zBuf+iStart,
21020 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43   zCompletion, nC
21030 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20  ompletion+1);.  
21040 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64      linenoiseAdd
21050 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a  Completion(lc, z
21060 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
21070 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
21080 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e  ze(pStmt);.}.#en
21090 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d  dif../*.** Do C-
210a0 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64  language style d
210b0 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  equoting..**.** 
210c0 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72     \a    -> alar
210d0 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e  m.**    \b    ->
210e0 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20   backspace.**   
210f0 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a   \t    -> tab.**
21100 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77      \n    -> new
21110 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20  line.**    \v   
21120 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62   -> vertical tab
21130 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20  .**    \f    -> 
21140 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20  form feed.**    
21150 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
21160 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
21170 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a  s    -> space.**
21180 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a      \"    -> ".*
21190 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a  *    \'    -> '.
211a0 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62  **    \\    -> b
211b0 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c  ackslash.**    \
211c0 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68  NNN  -> ascii ch
211d0 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f  aracter NNN in o
211e0 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ctal.*/.static v
211f0 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  oid resolve_back
21200 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29  slashes(char *z)
21210 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
21220 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28  char c;.  while(
21230 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20   *z && *z!='\\' 
21240 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  ) z++;.  for(i=j
21250 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
21260 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  0; i++, j++){.  
21270 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26    if( c=='\\' &&
21280 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20   z[i+1]!=0 ){.  
21290 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
212a0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27        if( c=='a'
212b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
212c0 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\a';.      }els
212d0 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a  e if( c=='b' ){.
212e0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27          c = '\b'
212f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21300 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
21310 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
21320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21330 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='n' ){.        
21340 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  c = '\n';.      
21350 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27  }else if( c=='v'
21360 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21370 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\v';.      }els
21380 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a  e if( c=='f' ){.
21390 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
213a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
213b0 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20  ( c=='r' ){.    
213c0 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
213d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
213e0 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
213f0 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d  c = '"';.      }
21400 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27  else if( c=='\''
21410 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21420 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\'';.      }els
21430 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b  e if( c=='\\' ){
21440 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c  .        c = '\\
21450 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21460 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
21470 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '7' ){.        c
21480 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20   -= '0';.       
21490 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
214a0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
214b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
214c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
214d0 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
214e0 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  '0';.          i
214f0 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
21500 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
21510 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
21520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20  ;.            c 
21530 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
21540 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
21550 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
21570 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  [j] = c;.  }.  i
21580 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20  f( j<i ) z[j] = 
21590 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
215a0 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69  rpret zArg as ei
215b0 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
215c0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  or a boolean val
215d0 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72  ue.  Return 1 or
215e0 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61   0.** for TRUE a
215f0 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72  nd FALSE.  Retur
21600 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  n the integer va
21610 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61  lue if appropria
21620 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
21630 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63  t booleanValue(c
21640 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
21650 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
21660 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
21670 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
21680 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65  .    for(i=2; he
21690 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
216a0 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a  [i])>=0; i++){}.
216b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
216c0 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27  (i=0; zArg[i]>='
216d0 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27  0' && zArg[i]<='
216e0 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20  9'; i++){}.  }. 
216f0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67   if( i>0 && zArg
21700 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [i]==0 ) return 
21710 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c  (int)(integerVal
21720 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66  ue(zArg) & 0xfff
21730 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71  fffff);.  if( sq
21740 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
21750 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20  rg, "on")==0 || 
21760 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21770 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29  zArg,"yes")==0 )
21780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21790 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
217a0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
217b0 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c  "off")==0 || sql
217c0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
217d0 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  g,"no")==0 ){.  
217e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
217f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
21800 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
21810 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  t a boolean valu
21820 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d  e: \"%s\". Assum
21830 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a  ing \"no\".\n",.
21840 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b            zArg);
21850 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21860 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
21870 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20  ar a shell flag 
21880 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62  according to a b
21890 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f  oolean value..*/
218a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
218b0 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c  OrClearFlag(Shel
218c0 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67  lState *p, unsig
218d0 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74  ned mFlag, const
218e0 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
218f0 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
21900 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68  (zArg) ){.    Sh
21910 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46  ellSetFlag(p, mF
21920 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lag);.  }else{. 
21930 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
21940 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d  g(p, mFlag);.  }
21950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
21960 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20  an output file, 
21970 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e  assuming it is n
21980 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64  ot stderr or std
21990 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
219a0 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63  id output_file_c
219b0 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  lose(FILE *f){. 
219c0 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64   if( f && f!=std
219d0 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72  out && f!=stderr
219e0 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a   ) fclose(f);.}.
219f0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70  ./*.** Try to op
21a00 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  en an output fil
21a10 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22  e.   The names "
21a20 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64  stdout" and "std
21a30 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f  err" are.** reco
21a40 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68  gnized and do th
21a50 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20  e right thing.  
21a60 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
21a70 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   if the output.*
21a80 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f  * filename is "o
21a90 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ff"..*/.static F
21aa0 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65  ILE *output_file
21ab0 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
21ac0 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65   *zFile, int bTe
21ad0 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20  xtMode){.  FILE 
21ae0 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  *f;.  if( strcmp
21af0 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29  (zFile,"stdout")
21b00 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
21b10 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69  tdout;.  }else i
21b20 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
21b30 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b   "stderr")==0 ){
21b40 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b  .    f = stderr;
21b50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
21b60 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22  cmp(zFile, "off"
21b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
21b80 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21b90 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  f = fopen(zFile,
21ba0 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22   bTextMode ? "w"
21bb0 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66   : "wb");.    if
21bc0 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( f==0 ){.      
21bd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21be0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
21bf0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
21c00 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ", zFile);.    }
21c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
21c20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
21c30 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
21c40 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f  .** A routine fo
21c50 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75  r handling outpu
21c60 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74  t from sqlite3_t
21c70 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  race()..*/.stati
21c80 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f  c int sql_trace_
21c90 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69  callback(.  unsi
21ca0 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20  gned mType,     
21cb0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
21cc0 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20   type */.  void 
21cd0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
21ce0 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53     /* The ShellS
21cf0 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  tate pointer */.
21d00 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20    void *pP,     
21d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75            /* Usu
21d20 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
21d30 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f  o sqlite_stmt */
21d40 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20  .  void *pX     
21d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
21d60 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a  xiliary output *
21d70 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  /.){.  ShellStat
21d80 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
21d90 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69  te*)pArg;.  sqli
21da0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
21db0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21dc0 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  Sql;.  int nSql;
21dd0 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f  .  if( p->traceO
21de0 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
21df0 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53  ;.  if( mType==S
21e00 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
21e10 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  E ){.    utf8_pr
21e20 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
21e30 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61  , "-- closing da
21e40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21e50 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  n\n");.    retur
21e60 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 0;.  }.  if( m
21e70 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41  Type!=SQLITE_TRA
21e80 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73  CE_ROW && ((cons
21e90 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d  t char*)pX)[0]==
21ea0 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  '-' ){.    zSql 
21eb0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
21ec0 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  X;.  }else{.    
21ed0 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
21ee0 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73  _stmt*)pP;.    s
21ef0 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65  witch( p->eTrace
21f00 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
21f10 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  se SHELL_TRACE_E
21f20 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20  XPANDED: {.     
21f30 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
21f40 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70  3_expanded_sql(p
21f50 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
21f60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
21f70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21f80 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20  LE_NORMALIZE.   
21f90 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52     case SHELL_TR
21fa0 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20  ACE_NORMALIZED: 
21fb0 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
21fc0 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
21fd0 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  zed_sql(pStmt);.
21fe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21ff0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
22000 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
22010 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
22020 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
22030 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
22040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22050 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30   }.  if( zSql==0
22060 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
22070 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
22080 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Sql);.  while( n
22090 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53  Sql>0 && zSql[nS
220a0 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53  ql-1]==';' ){ nS
220b0 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68  ql--; }.  switch
220c0 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63  ( mType ){.    c
220d0 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
220e0 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53  _ROW:.    case S
220f0 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
22100 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  : {.      utf8_p
22110 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
22120 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53  t, "%.*s;\n", nS
22130 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ql, zSql);.     
22140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22150 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
22160 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20  ACE_PROFILE: {. 
22170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
22180 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28  64 nNanosec = *(
22190 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
221a0 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  X;.      utf8_pr
221b0 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
221c0 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64  , "%.*s; -- %lld
221d0 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53   ns\n", nSql, zS
221e0 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20  ql, nNanosec);. 
221f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22210 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22220 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
22230 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
22240 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
22250 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
22260 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
22270 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
22280 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
22290 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
222a0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
222b0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
222c0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
222d0 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
222e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
222f0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
22300 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
22310 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
22320 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
22330 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
22340 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
22350 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
22360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
22370 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
22380 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
22390 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
223a0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
223b0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
223c0 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
223d0 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
223e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
223f0 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
22400 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
22410 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
22420 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22430 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
22440 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
22450 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
22460 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
22470 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
22480 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
22490 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
224a0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
224b0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
224c0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
224d0 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
224e0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
224f0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
22500 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
22510 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
22520 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
22530 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
22540 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22550 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
22560 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
22570 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
22580 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
22590 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
225a0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
225b0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
225c0 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
225d0 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
225e0 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
225f0 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
22600 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
22610 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
22620 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
22630 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
22640 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
22650 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
22660 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
22670 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
22680 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
22690 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
226a0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
226b0 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
226c0 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
226d0 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
226e0 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
226f0 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
22700 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
22710 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
22720 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
22730 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
22740 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
22750 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
22760 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
22770 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
22780 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
22790 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
227a0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
227b0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
227c0 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
227d0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
227e0 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
227f0 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
22800 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
22810 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
22820 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
22830 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
22840 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
22850 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
22860 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
22870 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
22880 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
22890 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
228a0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
228b0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
228c0 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
228d0 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
228e0 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
228f0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
22900 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
22910 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
22920 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
22930 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
22940 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
22950 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
22960 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
22970 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
22980 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
22990 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
229a0 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
229b0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
229c0 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
229d0 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
229e0 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
229f0 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
22a00 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
22a10 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
22a20 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
22a30 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
22a40 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
22a50 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
22a60 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
22a70 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
22a80 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
22a90 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
22aa0 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
22ab0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
22ac0 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
22ad0 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
22ae0 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
22af0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
22b00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22b20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
22b30 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
22b40 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
22b50 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
22b60 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
22b70 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
22b80 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
22b90 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
22ba0 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
22bb0 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
22bc0 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
22bd0 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
22be0 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
22bf0 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
22c00 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
22c10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
22c20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
22c30 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
22c40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
22c50 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
22c60 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
22c70 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22c90 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
22ca0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
22cb0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
22cc0 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
22cd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
22ce0 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
22cf0 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
22d00 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
22d10 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
22d20 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
22d30 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
22d40 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
22d50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22d60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
22d70 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
22d80 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
22d90 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
22da0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
22db0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
22dc0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
22dd0 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
22de0 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
22df0 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
22e00 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
22e10 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
22e20 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
22e30 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
22e40 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
22e50 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
22e60 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
22e70 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
22e80 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
22e90 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
22ea0 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
22eb0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
22ec0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
22ed0 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
22ee0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
22ef0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
22f00 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
22f10 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
22f20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
22f30 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
22f40 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
22f50 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
22f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
22f80 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
22f90 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
22fa0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
22fb0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
22fc0 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
22fd0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
22fe0 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
22ff0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
23000 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
23010 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
23020 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
23030 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
23040 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
23050 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
23060 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
23070 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
23080 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
23090 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
230a0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
230b0 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
230c0 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
230d0 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
230e0 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
230f0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
23100 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
23110 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
23120 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
23130 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
23140 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
23150 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
23160 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
23170 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
23180 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
23190 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
231a0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
231b0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
231c0 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
231d0 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
231e0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
231f0 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
23200 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
23210 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
23220 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
23230 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
23240 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
23250 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
23260 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
23270 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
23280 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
23290 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
232a0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
232b0 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
232c0 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
232d0 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
232e0 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
232f0 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
23300 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
23310 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
23320 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
23330 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
23340 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
23350 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
23360 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
23370 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
23380 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
23390 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
233a0 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
233b0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
233c0 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
233d0 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
233e0 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
233f0 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
23400 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
23410 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
23420 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
23430 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
23440 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
23450 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
23460 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
23470 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
23480 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
23490 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
234a0 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
234b0 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
234c0 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
234d0 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
234e0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
234f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
23500 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
23510 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
23520 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
23530 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23540 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
23550 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
23560 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
23570 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
23580 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
23590 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
235a0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
235b0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
235c0 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
235d0 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
235e0 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
235f0 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
23600 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
23610 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
23620 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
23630 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
23640 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
23650 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
23660 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23670 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
23680 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
23690 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
236a0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
236b0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
236c0 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
236d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
236e0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
236f0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
23700 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
23710 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
23720 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
23730 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
23740 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
23750 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
23760 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
23770 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
23780 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
23790 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
237a0 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
237b0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
237c0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
237d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
237e0 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
237f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23800 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
23810 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
23820 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
23830 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
23840 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
23850 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
23860 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
23870 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
23880 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
23890 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
238a0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
238b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
238c0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
238d0 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
238e0 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
238f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
23900 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
23910 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
23920 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
23930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23940 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
23950 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
23960 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
23970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
23980 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
23990 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
239a0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
239b0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
239c0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
239d0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
239e0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
239f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23a10 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
23a20 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
23a30 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
23a40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23a50 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
23a60 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23a70 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
23a80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
23a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
23ab0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
23ac0 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
23ad0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23ae0 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
23af0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
23b00 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
23b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
23b20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23b30 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
23b40 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
23b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23b60 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
23b70 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
23b80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
23b90 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
23ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23bb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
23bc0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
23bd0 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
23be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23bf0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
23c00 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
23c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
23c40 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
23c50 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
23c80 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
23c90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23ca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
23cb0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
23cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23cd0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
23ce0 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
23cf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
23d00 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23d40 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
23d50 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d80 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
23d90 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
23da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23db0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23dc0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
23dd0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
23de0 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
23df0 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
23e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
23e10 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
23e20 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
23e30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
23e40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23e50 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
23e60 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
23e70 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
23e80 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
23e90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23ea0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
23eb0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
23ec0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
23ed0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
23ee0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
23ef0 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
23f00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
23f10 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
23f20 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
23f30 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
23f40 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
23f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
23f60 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
23f70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23f80 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
23f90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
23fa0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
23fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23fc0 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
23fd0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
23fe0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
23ff0 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
24000 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
24010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24030 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
24040 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24050 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
24060 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
24070 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
24080 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
24090 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
240a0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
240b0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
240c0 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
240d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
240e0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
240f0 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
24100 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
24110 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
24120 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
24130 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
24140 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
24150 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
24160 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
24170 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
24180 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
24190 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
241a0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
241b0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
241c0 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
241d0 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
241e0 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
241f0 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
24200 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
24210 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
24220 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
24230 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
24240 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
24250 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
24260 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
24270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
24280 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
24290 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
242a0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
242b0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
242c0 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
242d0 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
242e0 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
242f0 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
24300 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
24310 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
24320 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
24330 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
24340 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
24350 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
24360 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
24370 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
24380 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
24390 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
243a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
243b0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
243c0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
243d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
243f0 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
24400 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24410 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
24420 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
24430 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
24440 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24450 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24460 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
24470 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
244a0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
244b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
244c0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
244d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
244e0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
244f0 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
24500 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
24510 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
24520 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
24530 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
24540 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24550 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
24560 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
24570 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24580 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
24590 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
245a0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
245b0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
245c0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
245d0 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
245e0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
245f0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
24600 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
24610 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24620 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
24630 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
24640 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
24650 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24660 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
24670 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
24680 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
24690 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
246a0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
246b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
246c0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
246d0 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
246e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
246f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
24700 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24710 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
24720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
24730 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
24740 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
24750 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
24760 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
24770 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
247a0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
247b0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
247c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
247d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
247e0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
247f0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
24800 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24810 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
24820 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
24830 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
24840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
24860 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
24870 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
24880 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
248b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
248c0 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
248d0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
248e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
248f0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
24900 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
24910 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
24920 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
24930 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
24940 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24950 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
24960 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
24970 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
24980 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
24990 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
249a0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
249b0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
249c0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
249d0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
249e0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
249f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24a00 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
24a10 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
24a20 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
24a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
24a40 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
24a50 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
24a60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
24a70 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
24a80 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
24a90 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
24aa0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
24ab0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
24ac0 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
24ad0 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
24ae0 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
24af0 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
24b00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24b10 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
24b20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
24b30 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
24b40 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
24b50 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
24b60 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
24b70 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
24b80 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
24b90 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
24ba0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
24bb0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
24bc0 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
24bd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
24be0 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
24bf0 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
24c00 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
24c10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
24c20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
24c30 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
24c40 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
24c50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24c60 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
24c70 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
24c80 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
24c90 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
24ca0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
24cb0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
24cc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24cd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24ce0 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
24cf0 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
24d00 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
24d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
24d20 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
24d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
24d40 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
24d50 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
24d60 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
24d70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
24d80 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
24d90 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
24da0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
24db0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
24dc0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
24dd0 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
24de0 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
24df0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
24e00 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
24e10 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
24e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
24e30 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
24e40 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
24e50 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
24e60 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
24e70 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
24e80 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
24e90 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
24ea0 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
24eb0 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
24ec0 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
24ed0 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
24ee0 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
24ef0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24f00 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
24f10 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
24f20 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
24f30 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
24f40 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
24f50 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
24f60 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
24f70 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
24f80 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
24f90 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
24fa0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
24fb0 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
24fc0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
24fd0 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
24fe0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
24ff0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
25000 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
25010 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
25020 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
25030 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
25040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25050 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
25060 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
25070 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
25080 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
25090 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
250a0 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
250b0 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
250c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
250d0 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
250e0 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
250f0 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
25100 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
25110 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
25120 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
25130 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
25140 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
25150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
25160 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
25170 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25180 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
25190 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
251a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
251b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
251c0 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
251d0 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
251e0 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
251f0 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
25200 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
25210 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
25220 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f  M) */.  }.  p->o
25230 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20  utfile[0] = 0;. 
25240 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
25250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
25260 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e  n SQL command an
25270 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e  d return the sin
25280 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73 75  gle integer resu
25290 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
252a0 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74  t db_int(ShellSt
252b0 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
252c0 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c  ar *zSql){.  sql
252d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
252e0 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
252f0 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
25300 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
25310 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
25320 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26  );.  if( pStmt &
25330 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
25340 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
25350 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73  W ){.    res = s
25360 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
25370 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a  t(pStmt,0);.  }.
25380 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
25390 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  ze(pStmt);.  ret
253a0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
253b0 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79  * Convert a 2-by
253c0 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67  te or 4-byte big
253d0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
253e0 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e  into a native in
253f0 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
25400 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
25410 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  2byteInt(unsigne
25420 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
25430 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b  turn (a[0]<<8) +
25440 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20   a[1];.}.static 
25450 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
25460 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  4byteInt(unsigne
25470 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
25480 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20  turn (a[0]<<24) 
25490 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28  + (a[1]<<16) + (
254a0 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b  a[2]<<8) + a[3];
254b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
254c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
254d0 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e  ".info" command.
254e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
254f0 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
25500 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
25510 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
25520 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  int shell_dbinfo
25530 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74  _command(ShellSt
25540 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67  ate *p, int nArg
25550 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
25560 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25570 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63  struct { const c
25580 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20  har *zName; int 
25590 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d  ofst; } aField[]
255a0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c   = {.     { "fil
255b0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
255c0 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20  :",  24  },.    
255d0 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61 67   { "database pag
255e0 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20  e count:",  28  
255f0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c  },.     { "freel
25600 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ist page count:"
25610 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  36  },.     {
25620 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a   "schema cookie:
25630 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c  ",        40  },
25640 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
25650 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20  format:",       
25660 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   44  },.     { "
25670 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
25680 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20  ze:",   48  },. 
25690 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75      { "autovacuu
256a0 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35  m top root:",  5
256b0 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e  2  },.     { "in
256c0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
256d0 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20  :",   64  },.   
256e0 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69    { "text encodi
256f0 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20  ng:",        56 
25700 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72   },.     { "user
25710 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
25720 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20      60  },.     
25730 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  { "application i
25740 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d  d:",       68  }
25750 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61  ,.     { "softwa
25760 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  re version:",   
25770 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20    96  },.  };.  
25780 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
25790 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
257a0 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63   *zName; const c
257b0 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75  har *zSql; } aQu
257c0 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  ery[] = {.     {
257d0 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c   "number of tabl
257e0 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
257f0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
25800 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
25810 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20  ='table'" },.   
25820 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69    { "number of i
25830 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20  ndexes:",.      
25840 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
25850 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
25860 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c  type='index'" },
25870 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
25880 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20  of triggers:",. 
25890 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
258a0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
258b0 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67  HERE type='trigg
258c0 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  er'" },.     { "
258d0 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a  number of views:
258e0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
258f0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
25900 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 76  %s WHERE type='v
25910 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  iew'" },.     { 
25920 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a  "schema size:",.
25930 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
25940 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29  otal(length(sql)
25950 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20  ) FROM %s" },.  
25960 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a  };.  int i, rc;.
25970 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61 74 61    unsigned iData
25980 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20  Version;.  char 
25990 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20 63  *zSchemaTab;.  c
259a0 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e  har *zDb = nArg>
259b0 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
259c0 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65  "main";.  sqlite
259d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
259e0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
259f0 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar aHdr[100];.  
25a00 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
25a10 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20   if( p->db==0 ) 
25a20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d  return 1;.  rc =
25a30 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
25a40 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
25a50 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
25a60 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65  data FROM sqlite
25a70 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45 52  _dbpage(?1) WHER
25a80 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20  E pgno=1",.     
25a90 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
25aa0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
25ab0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   ){.    if( !sql
25ac0 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
25ad0 6f 6e 5f 75 73 65 64 28 22 45 4e 41 42 4c 45 5f  on_used("ENABLE_
25ae0 44 42 50 41 47 45 5f 56 54 41 42 22 29 20 29 7b  DBPAGE_VTAB") ){
25af0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
25b00 74 66 28 73 74 64 65 72 72 2c 20 22 74 68 65 20  tf(stderr, "the 
25b10 5c 22 2e 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d  \".dbinfo\" comm
25b20 61 6e 64 20 72 65 71 75 69 72 65 73 20 74 68 65  and requires the
25b30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 44               "-D
25b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
25b60 50 41 47 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c  PAGE_VTAB compil
25b70 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e  e-time options\n
25b80 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
25b90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25ba0 28 73 74 64 65 72 72 2c 20 22 65 72 72 6f 72 3a  (stderr, "error:
25bb0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
25bc0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
25bd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25be0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
25bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
25c00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
25c10 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
25c20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49  1, zDb, -1, SQLI
25c30 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
25c40 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
25c50 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
25c60 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  W.   && sqlite3_
25c70 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
25c80 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20  mt,0)>100.  ){. 
25c90 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20     memcpy(aHdr, 
25ca0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
25cb0 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30  lob(pStmt,0), 10
25cc0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
25cd0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
25ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
25cf0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25d00 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
25d10 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
25d20 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
25d30 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
25d40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
25d50 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62  .  }.  i = get2b
25d60 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b  yteInt(aHdr+16);
25d70 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20  .  if( i==1 ) i 
25d80 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f  = 65536;.  utf8_
25d90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
25da0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61  %-20s %d\n", "da
25db0 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
25dc0 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70  :", i);.  utf8_p
25dd0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
25de0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69  -20s %d\n", "wri
25df0 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  te format:", aHd
25e00 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[18]);.  utf8_p
25e10 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
25e20 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61  -20s %d\n", "rea
25e30 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  d format:", aHdr
25e40 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [19]);.  utf8_pr
25e50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
25e60 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65  20s %d\n", "rese
25e70 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48  rved bytes:", aH
25e80 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69  dr[20]);.  for(i
25e90 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
25ea0 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20  aField); i++){. 
25eb0 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46     int ofst = aF
25ec0 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20  ield[i].ofst;.  
25ed0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
25ee0 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74  al = get4byteInt
25ef0 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20  (aHdr + ofst);. 
25f00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
25f10 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
25f20 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61  ", aField[i].zNa
25f30 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77  me, val);.    sw
25f40 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20  itch( ofst ){.  
25f50 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20      case 56: {. 
25f60 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
25f70 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
25f80 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22  ->out, " (utf8)"
25f90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
25fa0 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e  al==2 ) raw_prin
25fb0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
25fc0 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20  f16le)");.      
25fd0 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72    if( val==3 ) r
25fe0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
25ff0 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b  , " (utf16be)");
26000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26010 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
26020 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
26030 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  .  if( zDb==0 ){
26040 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
26050 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
26060 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  f("main.sqlite_m
26070 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
26080 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c   if( strcmp(zDb,
26090 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
260a0 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
260b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
260c0 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  %s", "sqlite_tem
260d0 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  p_master");.  }e
260e0 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  lse{.    zSchema
260f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
26100 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71  rintf("\"%w\".sq
26110 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44  lite_master", zD
26120 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
26130 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
26140 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20  Query); i++){.  
26150 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
26160 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
26170 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a  Query[i].zSql, z
26180 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20  SchemaTab);.    
26190 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74  int val = db_int
261a0 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  (p, zSql);.    s
261b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
261c0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
261d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
261e0 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b  s %d\n", aQuery[
261f0 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
26200 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
26210 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  ee(zSchemaTab);.
26220 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
26230 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44  ontrol(p->db, zD
26240 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
26250 44 41 54 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69  DATA_VERSION, &i
26260 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
26270 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26280 75 74 2c 20 22 25 2d 32 30 73 20 25 75 5c 6e 22  ut, "%-20s %u\n"
26290 2c 20 22 64 61 74 61 20 76 65 72 73 69 6f 6e 22  , "data version"
262a0 2c 20 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b  , iDataVersion);
262b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
262c0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
262d0 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
262e0 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74  errmsg() value t
262f0 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
26300 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 1..*/.static
26310 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61   int shellDataba
26320 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  seError(sqlite3 
26330 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
26340 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74  ar *zErr = sqlit
26350 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20  e3_errmsg(db);. 
26360 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
26370 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
26380 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74  n", zErr);.  ret
26390 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
263a0 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74  Compare the patt
263b0 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61  ern in zGlob[] a
263c0 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20  gainst the text 
263d0 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
263e0 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20  TRUE.** if they 
263f0 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20  match and FALSE 
26400 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e  (0) if they do n
26410 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
26420 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
26430 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
26440 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
26450 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
26460 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
26470 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
26480 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
26490 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
264a0 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
264b0 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
264c0 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
264d0 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
264e0 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
264f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
26500 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
26510 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
26520 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
26530 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
26540 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
26550 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
26560 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
26570 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
26580 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
26590 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
265a0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
265b0 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
265c0 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20   in front.**.** 
265d0 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41       ' '       A
265e0 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65  ny span of white
265f0 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e  space matches an
26600 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a  y other span of.
26610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
26620 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    whitespace..**
26630 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73  .** Extra whites
26640 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
26650 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65  of z[] is ignore
26660 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26670 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63   testcase_glob(c
26680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
26690 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
266a0 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
266b0 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
266c0 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c  nt seen;..  whil
266d0 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62  e( (c = (*(zGlob
266e0 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
266f0 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
26700 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53  {.      if( !IsS
26710 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72  pace(*z) ) retur
26720 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  n 0;.      while
26730 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62  ( IsSpace(*zGlob
26740 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20  ) ) zGlob++;.   
26750 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
26760 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
26770 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a   }else if( c=='*
26780 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ' ){.      while
26790 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29  ( (c=(*(zGlob++)
267a0 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d  )) == '*' || c==
267b0 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '?' ){.        i
267c0 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28  f( c=='?' && (*(
267d0 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
267e0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
267f0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
26800 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
26810 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26820 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
26830 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
26840 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
26850 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20  lob-1,z)==0 ){. 
26860 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20           z++;.  
26870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26880 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a  return (*z)!=0;.
26890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
268a0 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b  ile( (c2 = (*(z+
268b0 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  +)))!=0 ){.     
268c0 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20     while( c2!=c 
268d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
268e0 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
268f0 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
26900 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
26910 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26920 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
26930 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20  lob,z) ) return 
26940 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
26950 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
26960 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20  else if( c=='?' 
26970 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28  ){.      if( (*(
26980 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
26990 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
269a0 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
269b0 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
269c0 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   0;.      seen =
269d0 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
269e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
269f0 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  *(z++);.      if
26a00 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
26a10 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28  0;.      c2 = *(
26a20 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
26a30 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
26a40 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
26a50 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
26a60 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
26a70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
26a80 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
26a90 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
26aa0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
26ab0 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
26ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
26ad0 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d  hile( c2 && c2!=
26ae0 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
26af0 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47  f( c2=='-' && zG
26b00 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  lob[0]!=']' && z
26b10 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72  Glob[0]!=0 && pr
26b20 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
26b30 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
26b40 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b++);.          
26b50 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
26b60 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
26b70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
26b80 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
26b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26ba0 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
26bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
26bc0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
26bd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
26be0 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
26bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
26c00 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
26c10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26c20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
26c30 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65   invert)==0 ) re
26c40 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
26c50 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a  e if( c=='#' ){.
26c60 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d        if( (z[0]=
26c70 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b  ='-' || z[0]=='+
26c80 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b  ') && IsDigit(z[
26c90 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  1]) ) z++;.     
26ca0 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b   if( !IsDigit(z[
26cb0 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  0]) ) return 0;.
26cc0 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
26cd0 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
26ce0 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[0]) ){ z++; }.
26cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d00 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29   if( c!=(*(z++))
26d10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
26d20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
26d30 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a  IsSpace(*z) ){ z
26d40 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
26d50 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  z==0;.}.../*.** 
26d60 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69  Compare the stri
26d70 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d  ng as a command-
26d80 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68  line option with
26d90 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
26da0 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d  wo.** initial "-
26db0 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  " characters..*/
26dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
26dd0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
26de0 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
26df0 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69  char *zOpt){.  i
26e00 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20  f( zStr[0]!='-' 
26e10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53  ) return 0;.  zS
26e20 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72  tr++;.  if( zStr
26e30 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b  [0]=='-' ) zStr+
26e40 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  +;.  return strc
26e50 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d  mp(zStr, zOpt)==
26e60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
26e70 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  te a file..*/.in
26e80 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  t shellDeleteFil
26e90 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
26ea0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
26eb0 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  rc;.#ifdef _WIN3
26ec0 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d  2.  wchar_t *z =
26ed0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
26ee0 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a  tf8_to_unicode(z
26ef0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20  Filename);.  rc 
26f00 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20  = _wunlink(z);. 
26f10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
26f20 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75  ;.#else.  rc = u
26f30 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
26f40 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
26f50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
26f60 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ry to delete the
26f70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
26f80 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
26f90 29 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a  ) and free the.*
26fa0 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  * memory used to
26fb0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f   hold the name o
26fc0 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e  f the temp file.
26fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26fe0 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68  clearTempFile(Sh
26ff0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
27000 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
27010 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
27020 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  if( p->doXdgOpen
27030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
27040 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
27050 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29  (p->zTempFile) )
27060 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
27070 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
27080 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
27090 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pFile = 0;.}../*
270a0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
270b0 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20   temp file name 
270c0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
270d0 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffix..*/.static
270e0 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c   void newTempFil
270f0 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
27100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
27110 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65  ffix){.  clearTe
27120 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c  mpFile(p);.  sql
27130 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65  ite3_free(p->zTe
27140 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54  mpFile);.  p->zT
27150 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
27160 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
27170 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
27180 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53  trol(p->db, 0, S
27190 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
271a0 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54  FILENAME, &p->zT
271b0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  empFile);.  }.  
271c0 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
271d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
271e0 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
271f0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
27200 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
27210 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70  r);.    p->zTemp
27220 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
27230 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
27240 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78  .%s", r, zSuffix
27250 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27260 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73  p->zTempFile = s
27270 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27280 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70  %z.%s", p->zTemp
27290 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a  File, zSuffix);.
272a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
272b0 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
272c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
272d0 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
272e0 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
272f0 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (1);.  }.}.../*.
27300 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
27310 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61  ation of SQL sca
27320 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65  lar function fke
27330 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
27340 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74  (), used.** by t
27350 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69  he ".lint fkey-i
27360 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e  ndexes" command.
27370 20 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e   This scalar fun
27380 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a  ction is always.
27390 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66  ** called with f
273a0 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20  our arguments - 
273b0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
273c0 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e   name, the paren
273d0 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a  t column name,.*
273e0 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  * the child tabl
273f0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63  e name and the c
27400 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hild column name
27410 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63  ..**.**   fkey_c
27420 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70  ollate_clause('p
27430 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72  arent-tab', 'par
27440 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64  ent-col', 'child
27450 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f  -tab', 'child-co
27460 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  l').**.** If eit
27470 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  her of the named
27480 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d   tables or colum
27490 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c  ns do not exist,
274a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
274b0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70  * returns an emp
274c0 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d  ty string. An em
274d0 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c  pty string is al
274e0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62  so returned if b
274f0 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e  oth tables.** an
27500 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20  d columns exist 
27510 62 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  but have the sam
27520 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
27530 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72  ion sequence. Or
27540 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69  ,.** if both exi
27550 73 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75  st but the defau
27560 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
27570 75 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65  uences are diffe
27580 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75  rent, this.** fu
27590 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
275a0 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c  he string " COLL
275b0 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c  ATE <parent-coll
275c0 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a  ation>", where.*
275d0 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  * <parent-collat
275e0 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61  ion> is the defa
275f0 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
27600 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61  quence of the pa
27610 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  rent column..*/.
27620 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
27630 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
27640 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  se(.  sqlite3_co
27650 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
27660 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
27670 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
27680 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
27690 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
276a0 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
276b0 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx);.  const cha
276c0 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f  r *zParent;.  co
276d0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
276e0 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tCol;.  const ch
276f0 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a  ar *zParentSeq;.
27700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
27710 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  hild;.  const ch
27720 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20  ar *zChildCol;. 
27730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
27740 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20  ildSeq = 0;  /* 
27750 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76  Initialize to av
27760 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  oid false-positi
27770 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  ve warning */.  
27780 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
27790 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20  t( nVal==4 );.  
277a0 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
277b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
277c0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
277d0 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f  0]);.  zParentCo
277e0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
277f0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27800 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
27810 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74   zChild = (const
27820 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
27830 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
27840 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c  2]);.  zChildCol
27850 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27860 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
27870 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20  xt(apVal[3]);.. 
27880 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
27890 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d  text(pCtx, "", -
278a0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
278b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
278c0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
278d0 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64  etadata(.      d
278e0 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65  b, "main", zPare
278f0 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20  nt, zParentCol, 
27900 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20  0, &zParentSeq, 
27910 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  0, 0, 0.  );.  i
27920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27930 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
27940 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
27950 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
27960 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
27970 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f  zChild, zChildCo
27980 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71  l, 0, &zChildSeq
27990 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  , 0, 0, 0.    );
279a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
279b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
279c0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
279d0 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53  rentSeq, zChildS
279e0 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  eq) ){.    char 
279f0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
27a00 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25  intf(" COLLATE %
27a10 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b  s", zParentSeq);
27a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
27a30 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
27a40 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
27a50 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
27a60 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
27a70 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
27a80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
27a90 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e  f dot-command ".
27aa0 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
27ab0 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s"..*/.static in
27ac0 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  t lintFkeyIndexe
27ad0 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  s(.  ShellState 
27ae0 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
27af0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
27b00 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
27b10 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
27b20 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
27b30 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
27b40 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
27b50 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
27b60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27b90 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
27ba0 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73  zArg[] */.){.  s
27bb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74  qlite3 *db = pSt
27bc0 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  ate->db;       /
27bd0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
27be0 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e  e to query "main
27bf0 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c  " db of */.  FIL
27c00 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d  E *out = pState-
27c10 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  >out;        /* 
27c20 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20  Stream to write 
27c30 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74  non-error output
27c40 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65   to */.  int bVe
27c50 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20  rbose = 0;      
27c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d           /* If -
27c70 76 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65  verbose is prese
27c80 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f  nt */.  int bGro
27c90 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20  upByParent = 0; 
27ca0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67          /* If -g
27cb0 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20  roupbyparent is 
27cc0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
27cd0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27cf0 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
27d00 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  gh azArg[] */.  
27d10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64  const char *zInd
27d20 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20  ent = "";       
27d30 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69  /* How much to i
27d40 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44  ndent CREATE IND
27d50 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72  EX by */.  int r
27d60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27d80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
27d90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
27da0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
27db0 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69  * Compiled versi
27dc0 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  on of SQL statem
27dd0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
27de0 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c  /*.  ** This SEL
27df0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
27e00 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f  turns one row fo
27e10 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b  r each foreign k
27e20 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ey constraint.  
27e30 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ** in the schema
27e40 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
27e50 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d  abase. The colum
27e60 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20  n values are:.  
27e70 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74  **.  ** 0. The t
27e80 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
27e90 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20  atement similar 
27ea0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
27eb0 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52     "EXPLAIN QUER
27ec0 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
27ed0 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65  FROM child_table
27ee0 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79   WHERE child_key
27ef0 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  =?".  **.  **   
27f00 20 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20   This SELECT is 
27f10 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f  similar to the o
27f20 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  ne that the fore
27f30 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65  ign keys impleme
27f40 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ntation.  **    
27f50 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74  needs to run int
27f60 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64  ernally on child
27f70 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72   tables. If ther
27f80 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  e is an index th
27f90 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62  at can.  **    b
27fa0 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
27fb0 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ze this query, t
27fc0 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20  hen it can also 
27fd0 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46  be used by the F
27fe0 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d  K.  **    implem
27ff0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69  entation to opti
28000 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55  mize DELETE or U
28010 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
28020 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20   on the parent. 
28030 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20   **    table..  
28040 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f  **.  ** 1. A GLO
28050 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62  B pattern suitab
28060 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73  le for sqlite3_s
28070 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65  trglob(). If the
28080 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a   plan output by.
28090 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c    **    the EXPL
280a0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
280b0 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74  ommand matches t
280c0 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
280d0 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a  n the schema.  *
280e0 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e  *    contains an
280f0 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20   index that can 
28100 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
28110 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ize the query.. 
28120 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61   **.  ** 2. Huma
28130 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
28140 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
28150 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61  he child table a
28160 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
28170 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28180 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68   "child_table(ch
28190 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f  ild_key1, child_
281a0 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
281b0 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   3. Human readab
281c0 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
281d0 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e  cribes the paren
281e0 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
281f0 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
28200 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e   **       "paren
28210 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b  t_table(parent_k
28220 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32  ey1, parent_key2
28230 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20  )".  **.  ** 4. 
28240 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e  A full CREATE IN
28250 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  DEX statement fo
28260 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
28270 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
28280 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a  .  **    optimiz
28290 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
282a0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
282b0 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
282c0 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  e. e.g..  **.  *
282d0 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  *       "CREATE 
282e0 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c  INDEX child_tabl
282f0 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63  e_child_key ON c
28300 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
28310 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _key)".  **.  **
28320 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   5. The name of 
28330 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
28340 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73  ..  **.  ** Thes
28350 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65  e six values are
28360 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c   used by the C l
28370 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65  ogic below to ge
28380 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72  nerate the repor
28390 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t..  */.  const 
283a0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22  char *zSql =.  "
283b0 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
283c0 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52     'EXPLAIN QUER
283d0 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
283e0 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28  FROM ' || quote(
283f0 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45  s.name) || ' WHE
28400 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  RE '".    "  || 
28410 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f  group_concat(quo
28420 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e  te(s.name) || '.
28430 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72  ' || quote(f.[fr
28440 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20  om]) || '=?' ". 
28450 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f     "  || fkey_co
28460 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20  llate_clause(". 
28470 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61     "       f.[ta
28480 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
28490 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
284a0 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
284b0 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20  m]),' AND ')".  
284c0 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
284d0 20 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27   'SEARCH TABLE '
284e0 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20   || s.name || ' 
284f0 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
28500 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20  NDEX*('".    "  
28510 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28520 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20  '*=?', ' AND ') 
28530 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
28540 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d  .    "     s.nam
28550 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f  e  || '(' || gro
28560 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
28570 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29  m],  ', ') || ')
28580 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
28590 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
285a0 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
285b0 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28  concat(COALESCE(
285c0 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
285d0 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  )) || ')'".    "
285e0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43  , ".    "     'C
285f0 52 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c  REATE INDEX ' ||
28600 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c   quote(s.name ||
28610 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  '_'|| group_conc
28620 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27  at(f.[from], '_'
28630 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20  ))".    "  || ' 
28640 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  ON ' || quote(s.
28650 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20  name) || '('".  
28660 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
28670 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72  ncat(quote(f.[fr
28680 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20  om]) ||".    "  
28690 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61        fkey_colla
286a0 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
286b0 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61  "          f.[ta
286c0 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
286d0 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
286e0 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
286f0 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20  m]), ', ')".    
28700 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20  "  || ');'".    
28710 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
28720 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22  .[table] ".    "
28730 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
28740 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f  er AS s, pragma_
28750 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
28760 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a  (s.name) AS f ".
28770 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70      "LEFT JOIN p
28780 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f  ragma_table_info
28790 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73   AS p ON (pk-1=s
287a0 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b  eq AND p.arg=f.[
287b0 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47  table]) ".    "G
287c0 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20  ROUP BY s.name, 
287d0 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45  f.id ".    "ORDE
287e0 52 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20  R BY (CASE WHEN 
287f0 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d  ? THEN f.[table]
28800 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44   ELSE s.name END
28810 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63  )".  ;.  const c
28820 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20  har *zGlobIPK = 
28830 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20  "SEARCH TABLE * 
28840 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
28850 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
28860 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32  =?)";..  for(i=2
28870 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
28880 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
28890 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  en30(azArg[i]);.
288a0 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
288b0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
288c0 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72  "-verbose", azAr
288d0 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
288e0 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20       bVerbose = 
288f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
28900 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c  e if( n>1 && sql
28910 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
28920 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20  groupbyparent", 
28930 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
28940 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42  ){.      bGroupB
28950 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20  yParent = 1;.   
28960 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20     zIndent = "  
28970 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65    ";.    }.    e
28980 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
28990 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
289a0 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65  sage: %s %s ?-ve
289b0 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79  rbose? ?-groupby
289c0 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20  parent?\n",.    
289d0 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20        azArg[0], 
289e0 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29  azArg[1].      )
289f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28a00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
28a10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67   }.  }..  /* Reg
28a20 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63  ister the fkey_c
28a30 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20  ollate_clause() 
28a40 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
28a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
28a60 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
28a70 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  b, "fkey_collate
28a80 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c  _clause", 4, SQL
28a90 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
28aa0 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  0, shellFkeyColl
28ab0 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a  ateClause, 0, 0.
28ac0 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d    );...  if( rc=
28ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
28af0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
28b00 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30  ql, -1, &pSql, 0
28b10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
28b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b30 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
28b40 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f  nt(pSql, 1, bGro
28b50 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d  upByParent);.  }
28b60 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
28b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
28b80 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   rc2;.    char *
28b90 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77  zPrev = 0;.    w
28ba0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
28bb0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
28bc0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Sql) ){.      in
28bd0 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  t res = -1;.    
28be0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
28bf0 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
28c00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28c10 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68  zEQP = (const ch
28c20 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
28c30 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
28c40 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
28c50 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e  ar *zGlob = (con
28c60 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
28c70 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
28c80 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 1);.      con
28c90 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
28ca0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
28cb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
28cc0 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20  t(pSql, 2);.    
28cd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
28ce0 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arget = (const c
28cf0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
28d00 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
28d10 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
28d20 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73  har *zCI = (cons
28d30 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
28d40 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
28d50 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 4);.      cons
28d60 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20  t char *zParent 
28d70 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
28d80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
28d90 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20  xt(pSql, 5);..  
28da0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28db0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
28dc0 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
28dd0 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ain, 0);.      i
28de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28df0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28e00 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
28e10 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
28e20 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  plain) ){.      
28e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28e40 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lan = (const cha
28e50 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
28e60 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
28e70 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   3);.        res
28e80 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
28e90 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74     0==sqlite3_st
28ea0 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c  rglob(zGlob, zPl
28eb0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  an).           |
28ec0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
28ed0 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a  glob(zGlobIPK, z
28ee0 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b  Plan).        );
28ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28f00 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
28f10 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
28f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28f30 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
28f40 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
28f50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
28f60 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28f70 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c  "Error: internal
28f80 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
28f90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
28fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
28fb0 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  ( bGroupByParent
28fc0 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
28fd0 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
28fe0 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
28ff0 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
29000 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
29010 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20  , zPrev)).      
29020 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
29030 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
29040 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  -- Parent table 
29050 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b  %s\n", zParent);
29060 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29070 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
29080 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20            zPrev 
29090 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
290a0 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29  f("%s", zParent)
290b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
290c0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
290d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
290e0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
290f0 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49  %s --> %s\n", zI
29100 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72  ndent, zCI, zTar
29110 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
29120 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65  lse if( bVerbose
29130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
29140 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
29150 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64  s/* no extra ind
29160 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  exes required fo
29170 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22  r %s -> %s */\n"
29180 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29190 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20  zIndent, zFrom, 
291a0 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  zTarget.        
291b0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
291c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
291d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
291e0 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  rev);..    if( r
291f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29200 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29210 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
29220 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
29230 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  db));.    }..   
29240 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
29250 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20  inalize(pSql);. 
29260 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29270 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c  E_OK && rc2!=SQL
29280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29290 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
292a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
292b0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
292c0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
292d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
292e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
292f0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
29300 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
29310 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
29320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
29330 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
29340 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d  ".lint" dot comm
29350 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
29360 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e  nt lintDotComman
29370 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
29380 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
29390 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
293a0 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
293b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
293c0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
293d0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
293e0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
293f0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
29400 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29430 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
29440 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
29450 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72  nt n;.  n = (nAr
29460 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28  g>=2 ? strlen30(
29470 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
29480 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c    if( n<1 || sql
29490 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a  ite3_strnicmp(az
294a0 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e  Arg[1], "fkey-in
294b0 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74  dexes", n) ) got
294c0 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72  o usage;.  retur
294d0 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  n lintFkeyIndexe
294e0 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c  s(pState, azArg,
294f0 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a   nArg);.. usage:
29500 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
29510 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20  derr, "Usage %s 
29520 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69  sub-command ?swi
29530 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a  tches...?\n", az
29540 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70  Arg[0]);.  raw_p
29550 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
29560 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  here sub-command
29570 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61  s are:\n");.  ra
29580 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29590 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78   "    fkey-index
295a0 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  es\n");.  return
295b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
295c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 20 53  ..#if !defined S
295d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
295e0 41 4c 54 41 42 4c 45 0a 73 74 61 74 69 63 20 76  ALTABLE.static v
295f0 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
29600 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
29610 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20   .  int *pRc, . 
29620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
29630 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l, .  sqlite3_st
29640 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20  mt **ppStmt.){. 
29650 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
29660 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
29670 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
29680 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
29690 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
296a0 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b   -1, ppStmt, 0);
296b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
296c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
296d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
296e0 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 25  r, "sql error: %
296f0 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  s (%d)\n", .    
29700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
29710 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74 65  rmsg(db), sqlite
29720 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20 20  3_errcode(db).  
29730 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52      );.      *pR
29740 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
29750 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
29760 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
29770 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ntf(.  sqlite3 *
29780 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
29790 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
297a0 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e   **ppStmt,.  con
297b0 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a  st char *zFmt, .
297c0 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74    ....){.  *ppSt
297d0 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
297e0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
297f0 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
29800 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
29810 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
29820 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  Fmt);.    z = sq
29830 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
29840 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  Fmt, ap);.    va
29850 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66  _end(ap);.    if
29860 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
29870 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
29880 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
29890 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
298a0 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70  re(db, pRc, z, p
298b0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71  pStmt);.      sq
298c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
298d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
298e0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e  ic void shellFin
298f0 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52  alize(.  int *pR
29900 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  c, .  sqlite3_st
29910 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69  mt *pStmt.){.  i
29920 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
29930 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
29940 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
29950 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20  pStmt);.    int 
29960 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
29970 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
29980 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
29990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
299a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
299b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
299c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
299d0 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
299e0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
299f0 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (db));.      }. 
29a00 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a       *pRc = rc;.
29a10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
29a20 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52 65  tic void shellRe
29a30 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  set(.  int *pRc,
29a40 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
29a50 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74   *pStmt.){.  int
29a60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
29a70 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
29a80 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
29a90 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21  K ){.    if( rc!
29aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29ab0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
29ac0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
29ad0 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
29ae0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29af0 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
29b00 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
29b10 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
29b20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63   }.    *pRc = rc
29b30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
29b40 2a 20 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54  * !defined SQLIT
29b50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
29b60 42 4c 45 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  BLE */..#if !def
29b70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
29b80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
29b90 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
29ba0 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a  _HAVE_ZLIB)./***
29bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
29c00 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76 65 22  * The ".archive"
29c10 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
29c20 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 74 72 75  d..*/./*.** Stru
29c30 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69  cture representi
29c40 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72  ng a single ".ar
29c50 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79  " command..*/.ty
29c60 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72 43  pedef struct ArC
29c70 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64  ommand ArCommand
29c80 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61  ;.struct ArComma
29c90 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20  nd {.  u8 eCmd; 
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f         /* An AR_
29cc0 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  CMD_* value */. 
29cd0 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20   u8 bVerbose;   
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65   /* True if --ve
29d00 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a  rbose */.  u8 bZ
29d10 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
29d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29d30 75 65 20 69 66 20 74 68 65 20 61 72 63 68 69 76  ue if the archiv
29d40 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20  e is a ZIP */.  
29d50 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20  u8 bDryRun;     
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79  /* True if --dry
29d80 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70  -run */.  u8 bAp
29d90 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pend;           
29da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29db0 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f  e if --append */
29dc0 0a 20 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e  .  u8 fromCmdLin
29dd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29de0 20 20 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d     /* Run from -
29df0 41 20 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72  A instead of .ar
29e00 63 68 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  chive */.  int n
29e10 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
29e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29e30 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  mber of command 
29e40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
29e50 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20  har *zSrcTable; 
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e70 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66  * "sqlar", "zipf
29e80 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22  ile($file)" or "
29e90 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zip" */.  const 
29ea0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
29eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66            /* --f
29ec0 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72  ile argument, or
29ed0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
29ee0 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20   char *zDir;    
29ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d             /* --
29f00 64 69 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65  directory argume
29f10 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  nt, or NULL */. 
29f20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20   char **azArg;  
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d   /* Array of com
29f50 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
29f60 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
29f70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
29f80 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
29f90 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
29fa0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
29fb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
29fc0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
29fd0 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b  he archive */.};
29fe0 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
29ff0 75 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f  usage message fo
2a000 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e  r the .ar comman
2a010 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  d to stderr and 
2a020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a030 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
2a040 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20  nt arUsage(FILE 
2a050 2a 66 29 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28  *f){.  showHelp(
2a060 66 2c 22 61 72 63 68 69 76 65 22 29 3b 0a 20 20  f,"archive");.  
2a070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a080 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ROR;.}../*.** Pr
2a090 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
2a0a0 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
2a0b0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
2a0c0 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a  rr and return .*
2a0d0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  * SQLITE_ERROR..
2a0e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2a0f0 45 72 72 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61  ErrorMsg(ArComma
2a100 6e 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63  nd *pAr, const c
2a110 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
2a120 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2a130 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73   char *z;.  va_s
2a140 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2a150 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
2a160 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
2a170 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2a180 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a190 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2a1a0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  \n", z);.  if( p
2a1b0 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20  Ar->fromCmdLine 
2a1c0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2a1d0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20  tf(stderr, "Use 
2a1e0 5c 22 2d 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20  \"-A\" for more 
2a1f0 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  help\n");.  }els
2a200 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
2a210 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20  tf(stderr, "Use 
2a220 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c  \".archive --hel
2a230 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c  p\" for more hel
2a240 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p\n");.  }.  sql
2a250 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
2a260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a270 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  ROR;.}../*.** Va
2a280 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61  lues for ArComma
2a290 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66  nd.eCmd..*/.#def
2a2a0 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ine AR_CMD_CREAT
2a2b0 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  E       1.#defin
2a2c0 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20  e AR_CMD_UPDATE 
2a2d0 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
2a2e0 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20 20 20  AR_CMD_INSERT   
2a2f0 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52      3.#define AR
2a300 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 20 20 20  _CMD_EXTRACT    
2a310 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    4.#define AR_C
2a320 4d 44 5f 4c 49 53 54 20 20 20 20 20 20 20 20 20  MD_LIST         
2a330 35 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  5.#define AR_CMD
2a340 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20 36 0a  _HELP         6.
2a350 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e 6f  ./*.** Other (no
2a360 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74 63  n-command) switc
2a370 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  hes..*/.#define 
2a380 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
2a390 45 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20  E     7.#define 
2a3a0 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20 20  AR_SWITCH_FILE  
2a3b0 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20        8.#define 
2a3c0 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
2a3d0 4f 52 59 20 20 20 39 0a 23 64 65 66 69 6e 65 20  ORY   9.#define 
2a3e0 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
2a3f0 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20       10.#define 
2a400 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
2a410 20 20 20 20 20 31 31 0a 0a 73 74 61 74 69 63 20       11..static 
2a420 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77 69  int arProcessSwi
2a430 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  tch(ArCommand *p
2a440 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c  Ar, int eSwitch,
2a450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2a460 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53  g){.  switch( eS
2a470 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73  witch ){.    cas
2a480 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
2a490 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
2a4a0 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61  _EXTRACT:.    ca
2a4b0 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a  se AR_CMD_LIST:.
2a4c0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2a4d0 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65  UPDATE:.    case
2a4e0 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a   AR_CMD_INSERT:.
2a4f0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2a500 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66 28 20  HELP:.      if( 
2a510 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20  pAr->eCmd ){.   
2a520 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
2a530 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c  rorMsg(pAr, "mul
2a540 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70  tiple command op
2a550 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d  tions");.      }
2a560 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64  .      pAr->eCmd
2a570 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20   = eSwitch;.    
2a580 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
2a590 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  se AR_SWITCH_DRY
2a5a0 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  RUN:.      pAr->
2a5b0 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20  bDryRun = 1;.   
2a5c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2a5d0 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  se AR_SWITCH_VER
2a5e0 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d  BOSE:.      pAr-
2a5f0 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  >bVerbose = 1;. 
2a600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a610 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41  case AR_SWITCH_A
2a620 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72  PPEND:.      pAr
2a630 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20  ->bAppend = 1;. 
2a640 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
2a650 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f  u into --file */
2a660 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
2a670 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20  TCH_FILE:.      
2a680 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72  pAr->zFile = zAr
2a690 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
2a6a0 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
2a6b0 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20  CH_DIRECTORY:.  
2a6c0 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20      pAr->zDir = 
2a6d0 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61  zArg;.      brea
2a6e0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2a6f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a700 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63  *.** Parse the c
2a710 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20  ommand line for 
2a720 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  an ".ar" command
2a730 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  . The results ar
2a740 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
2a750 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a 70 41  * structure (*pA
2a760 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  r). SQLITE_OK is
2a770 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2a780 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73   command line is
2a790 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65   parsed.** succe
2a7a0 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69  ssfully, otherwi
2a7b0 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  se an error mess
2a7c0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
2a7d0 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a  o stderr and .**
2a7e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65   SQLITE_ERROR re
2a7f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2a800 63 20 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d  c int arParseCom
2a810 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61  mand(.  char **a
2a820 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
2a830 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2a840 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
2a850 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
2a860 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
2a870 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2a880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a890 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2a8a0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72   azArg[] */.  Ar
2a8b0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20  Command *pAr    
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a8d0 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f   Populate this o
2a8e0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2a8f0 72 75 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a  ruct ArSwitch {.
2a900 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a910 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20  zLong;.    char 
2a920 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65  cShort;.    u8 e
2a930 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62  Switch;.    u8 b
2a940 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68  Arg;.  } aSwitch
2a950 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72  [] = {.    { "cr
2a960 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41  eate",    'c', A
2a970 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20  R_CMD_CREATE,   
2a980 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2a990 65 78 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c  extract",   'x',
2a9a0 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c   AR_CMD_EXTRACT,
2a9b0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2a9c0 20 22 69 6e 73 65 72 74 22 2c 20 20 20 20 27 69   "insert",    'i
2a9d0 27 2c 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54  ', AR_CMD_INSERT
2a9e0 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
2a9f0 20 7b 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20   { "list",      
2aa00 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54  't', AR_CMD_LIST
2aa10 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
2aa20 20 20 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20     { "update",  
2aa30 20 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50    'u', AR_CMD_UP
2aa40 44 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  DATE,       0 },
2aa50 0a 20 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20  .    { "help",  
2aa60 20 20 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f      'h', AR_CMD_
2aa70 48 45 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20  HELP,         0 
2aa80 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73  },.    { "verbos
2aa90 65 22 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57  e",   'v', AR_SW
2aaa0 49 54 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20  ITCH_VERBOSE,   
2aab0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65  0 },.    { "file
2aac0 22 2c 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f  ",      'f', AR_
2aad0 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20  SWITCH_FILE,    
2aae0 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70    1 },.    { "ap
2aaf0 70 65 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41  pend",    'a', A
2ab00 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c  R_SWITCH_APPEND,
2ab10 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
2ab20 64 69 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c  directory", 'C',
2ab30 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
2ab40 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b  TORY, 1 },.    {
2ab50 20 22 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e   "dryrun",    'n
2ab60 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  ', AR_SWITCH_DRY
2ab70 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d  RUN,    0 },.  }
2ab80 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20  ;.  int nSwitch 
2ab90 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68  = sizeof(aSwitch
2aba0 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ) / sizeof(struc
2abb0 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73  t ArSwitch);.  s
2abc0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
2abd0 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b  pEnd = &aSwitch[
2abe0 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28  nSwitch];..  if(
2abf0 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20   nArg<=1 ){.    
2ac00 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2ac10 72 72 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65  rr, "Wrong numbe
2ac20 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
2ac30 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20   Usage:\n");.   
2ac40 20 72 65 74 75 72 6e 20 61 72 55 73 61 67 65 28   return arUsage(
2ac50 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65  stderr);.  }else
2ac60 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
2ac70 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66  azArg[1];.    if
2ac80 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
2ac90 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f       /* Traditio
2aca0 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20  nal style [tar] 
2acb0 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
2acc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2acd0 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20   int iArg = 2;. 
2ace0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
2acf0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
2ad00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2ad10 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
2ad20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
2ad30 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66  *pOpt;.        f
2ad40 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
2ad50 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
2ad60 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
2ad70 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
2ad80 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
2ad90 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2ada0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
2adb0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
2adc0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2add0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
2ade0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63  nized option: %c
2adf0 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
2ae00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ae10 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
2ae20 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2ae30 3e 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20  >=nArg ){.      
2ae40 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2ae50 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
2ae60 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
2ae70 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
2ae80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
2ae90 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
2aea0 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
2aeb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2aec0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
2aed0 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
2aee0 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
2aef0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2af00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
2af10 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
2af20 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
2af30 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
2af40 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
2af50 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
2af60 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
2af70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2af80 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
2af90 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
2afa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
2afb0 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
2afc0 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
2afd0 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
2afe0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
2aff0 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
2b000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
2b010 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
2b020 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
2b030 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
2b040 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
2b050 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
2b060 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
2b070 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
2b080 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
2b090 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
2b0a0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
2b0b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b0c0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
2b0d0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20  strlen30(z);..  
2b0e0 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d        if( z[1]!=
2b0f0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
2b100 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
2b110 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
2b120 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a   short options *
2b130 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
2b140 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
2b150 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
2b160 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
2b170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ;.            st
2b180 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
2b190 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
2b1a0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
2b1b0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
2b1c0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
2b1d0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
2b1e0 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
2b1f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b210 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
2b220 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2b230 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2b240 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63  rMsg(pAr, "unrec
2b250 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
2b260 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20  %c", z[i]);.    
2b270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b280 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
2b290 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
2b2a0 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31        if( i<(n-1
2b2b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2b2c0 20 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69       zArg = &z[i
2b2d0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1];.           
2b2e0 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20       i = n;.    
2b2f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b310 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67   if( iArg>=(nArg
2b320 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
2b330 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b340 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2b350 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
2b360 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63   an argument: %c
2b370 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ",z[i]);.       
2b380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b390 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
2b3a0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
2b3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b3d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
2b3e0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
2b3f0 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
2b400 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
2b410 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2b420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b430 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
2b440 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  2]=='\0' ){.    
2b450 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70        /* A -- op
2b460 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67  tion, indicating
2b470 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e   that all remain
2b480 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
2b490 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20   words.         
2b4a0 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20   ** are command 
2b4b0 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  arguments.  */. 
2b4c0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
2b4d0 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
2b4e0 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g+1];.          
2b4f0 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
2b500 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20  -iArg-1;.       
2b510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b530 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74     /* A long opt
2b540 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
2b550 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2b560 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
2b570 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66     /* Argument f
2b580 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e  or option, if an
2b590 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  y */.          s
2b5a0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
2b5b0 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
2b5c0 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74   /* Matching opt
2b5d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
2b5e0 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
2b5f0 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *pOpt;         
2b600 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a     /* Iterator *
2b610 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
2b620 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
2b630 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
2b640 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
2b650 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
2b660 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e  ong = pOpt->zLon
2b670 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g;.            i
2b680 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e  f( (n-2)<=strlen
2b690 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d  30(zLong) && 0==
2b6a0 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c  memcmp(&z[2], zL
2b6b0 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20  ong, n-2) ){.   
2b6c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b6d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
2b6e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b6f0 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2b700 22 61 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f  "ambiguous optio
2b710 6e 3a 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20  n: %s",z);.     
2b720 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 70 4d 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20  pMatch = pOpt;. 
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b760 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b770 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b780 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d      if( pMatch==
2b790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b7a0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2b7b0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
2b7c0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  nized option: %s
2b7d0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
2b7e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2b7f0 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b   pMatch->bArg ){
2b800 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b810 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
2b820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b830 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2b840 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
2b850 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
2b860 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  ment: %s", z);. 
2b870 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b880 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
2b890 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
2b8a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b8b0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
2b8c0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d  ssSwitch(pAr, pM
2b8d0 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a  atch->eSwitch, z
2b8e0 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
2b8f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b900 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b910 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2b920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b930 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b940 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
2b950 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77   all arguments w
2b960 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d  ithin the ArComm
2b970 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61  and.azArg[].** a
2b980 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61 72  rray refer to ar
2b990 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61  chive members, a
2b9a0 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72  s for the --extr
2b9b0 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f  act or --list co
2b9c0 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63  mmands. .** It c
2b9d0 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68 20  hecks that each 
2b9e0 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65 73  of them are pres
2b9f0 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63  ent. If any spec
2ba00 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f  ified file is no
2ba10 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  t.** present in 
2ba20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20  the archive, an 
2ba30 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64  error is printed
2ba40 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61   to stderr and a
2ba50 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  n error.** code 
2ba60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2ba70 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63  ise, if all spec
2ba80 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20  ified arguments 
2ba90 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  are present in.*
2baa0 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 53  * the archive, S
2bab0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2bac0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
2bad0 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73   function strips
2bae0 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f   any trailing '/
2baf0 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  ' characters fro
2bb00 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e  m each argument.
2bb10 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73  .** This is cons
2bb20 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65 20  istent with the 
2bb30 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f  way the [tar] co
2bb40 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77  mmand seems to w
2bb50 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e  ork on.** Linux.
2bb60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2bb70 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72  rCheckEntries(Ar
2bb80 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
2bb90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bba0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e  _OK;.  if( pAr->
2bbb0 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  nArg ){.    int 
2bbc0 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65  i, j;.    sqlite
2bbd0 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20  3_stmt *pTest = 
2bbe0 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65  0;..    shellPre
2bbf0 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e  parePrintf(pAr->
2bc00 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c  db, &rc, &pTest,
2bc10 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2bc20 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48   name FROM %s WH
2bc30 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c  ERE name=$name",
2bc40 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a   .        pAr->z
2bc50 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a  SrcTable.    );.
2bc60 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
2bc70 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2bc80 6e 64 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61  ndex(pTest, "$na
2bc90 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  me");.    for(i=
2bca0 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
2bcb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2bcc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
2bcd0 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
2bce0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  g[i];.      int 
2bcf0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
2bd00 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  .      int bOk =
2bd10 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
2bd20 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
2bd30 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  '/' ) n--;.     
2bd40 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20   z[n] = '\0';.  
2bd50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2bd60 5f 74 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20  _text(pTest, j, 
2bd70 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  z, -1, SQLITE_ST
2bd80 41 54 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28  ATIC);.      if(
2bd90 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2bda0 69 74 65 33 5f 73 74 65 70 28 70 54 65 73 74 29  ite3_step(pTest)
2bdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   ){.        bOk 
2bdc0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2bdd0 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
2bde0 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20  c, pTest);.     
2bdf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2be00 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
2be10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2be20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74  ntf(stderr, "not
2be30 20 66 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76   found in archiv
2be40 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  e: %s\n", z);.  
2be50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2be60 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
2be70 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
2be80 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54  Finalize(&rc, pT
2be90 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  est);.  }.  retu
2bea0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2beb0 46 6f 72 6d 61 74 20 61 20 57 48 45 52 45 20 63  Format a WHERE c
2bec0 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62  lause that can b
2bed0 65 20 75 73 65 64 20 61 67 61 69 6e 73 74 20 74  e used against t
2bee0 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
2bef0 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20   to.** identify 
2bf00 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62  all archive memb
2bf10 65 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ers that match t
2bf20 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  he command argum
2bf30 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20  ents held.** in 
2bf40 28 2a 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68  (*pAr). Leave th
2bf50 69 73 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  is WHERE clause 
2bf60 69 6e 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65  in (*pzWhere) be
2bf70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2bf80 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
2bf90 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2bfa0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
2bfb0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
2bfc0 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e  () on.** any non
2bfd0 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29  -NULL (*pzWhere)
2bfe0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
2bff0 63 20 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c  c void arWhereCl
2c000 61 75 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ause(.  int *pRc
2c010 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  , .  ArCommand *
2c020 70 41 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  pAr, .  char **p
2c030 7a 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  zWhere          
2c040 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2c050 4e 65 77 20 57 48 45 52 45 20 63 6c 61 75 73 65  New WHERE clause
2c060 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2c070 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28  Where = 0;.  if(
2c080 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
2c090 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d   ){.    if( pAr-
2c0a0 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >nArg==0 ){.    
2c0b0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
2c0c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b  e3_mprintf("1");
2c0d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c0e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
2c0f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
2c100 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  = "";.      for(
2c110 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
2c120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c130 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2c140 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20  pAr->azArg[i];. 
2c150 20 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20         zWhere = 
2c160 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c170 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a 25 73  .          "%z%s
2c180 20 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20   name = '%q' OR 
2c190 73 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64  substr(name,1,%d
2c1a0 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20  ) = '%q/'", .   
2c1b0 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a         zWhere, z
2c1c0 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30  Sep, z, strlen30
2c1d0 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20  (z)+1, z.       
2c1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c1f0 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  zWhere==0 ){.   
2c200 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
2c210 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
2c240 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20  Sep = " OR ";.  
2c250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c260 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
2c270 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ere;.}../*.** Im
2c280 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2c290 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61  .ar "lisT" comma
2c2a0 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
2c2b0 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64  nt arListCommand
2c2c0 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29  (ArCommand *pAr)
2c2d0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c2e0 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25  zSql = "SELECT %
2c2f0 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  s FROM %s WHERE 
2c300 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68  %s"; .  const ch
2c310 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b  ar *azCols[] = {
2c320 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20  .    "name",.   
2c330 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20   "lsmode(mode), 
2c340 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69  sz, datetime(mti
2c350 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29  me, 'unixepoch')
2c360 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20  , name".  };..  
2c370 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
2c380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2c390 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
2c3a0 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72  t rc;..  rc = ar
2c3b0 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72  CheckEntries(pAr
2c3c0 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75  );.  arWhereClau
2c3d0 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57  se(&rc, pAr, &zW
2c3e0 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50  here);..  shellP
2c3f0 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72  reparePrintf(pAr
2c400 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c  ->db, &rc, &pSql
2c410 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70  , zSql, azCols[p
2c420 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20  Ar->bVerbose],. 
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
2c450 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69  le, zWhere);.  i
2c460 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2c470 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2c480 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2c490 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2c4a0 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65  sql(pSql));.  }e
2c4b0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2c4c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c4d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2c4e0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
2c4f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  ){.      if( pAr
2c500 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
2c510 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c520 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2c530 25 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73  %s % 10d  %s  %s
2c540 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2c550 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c560 74 65 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20  text(pSql, 0),. 
2c570 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c580 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2c590 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20  ql, 1), .       
2c5a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2c5b0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
2c5c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
2c5d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2c5e0 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20  xt(pSql, 3).    
2c5f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
2c600 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
2c610 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2c620 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
2c630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2c640 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20  (pSql, 0));.    
2c650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2c660 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
2c670 63 2c 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69  c, pSql);.  sqli
2c680 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
2c690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c6a0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
2c6b0 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
2c6c0 65 58 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64  eXtract" command
2c6d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
2c6e0 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e   arExtractComman
2c6f0 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  d(ArCommand *pAr
2c700 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2c710 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53  *zSql1 = .    "S
2c720 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 28 24  ELECT ".    " ($
2c730 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20  dir || name),". 
2c740 20 20 20 22 20 77 72 69 74 65 66 69 6c 65 28 28     " writefile((
2c750 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25  $dir || name), %
2c760 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20  s, mode, mtime) 
2c770 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57  ".    "FROM %s W
2c780 48 45 52 45 20 28 25 73 29 20 41 4e 44 20 28 64  HERE (%s) AND (d
2c790 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24  ata IS NULL OR $
2c7a0 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20  dirOnly = 0)".  
2c7b0 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54    " AND name NOT
2c7c0 20 47 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a   GLOB '*..[/\\]*
2c7d0 27 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  '";..  const cha
2c7e0 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20  r *azExtraArg[] 
2c7f0 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f  = { .    "sqlar_
2c800 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c  uncompress(data,
2c810 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61   sz)",.    "data
2c820 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  ".  };..  sqlite
2c830 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
2c840 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c850 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
2c860 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
2c870 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
2c880 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20  int i, j;..  /* 
2c890 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  If arguments are
2c8a0 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63   specified, chec
2c8b0 6b 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75  k that they actu
2c8c0 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69  ally exist withi
2c8d0 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69  n.  ** the archi
2c8e0 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ve before procee
2c8f0 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c  ding. And formul
2c900 61 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ate a WHERE clau
2c910 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  se to.  ** match
2c920 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20   them.  */.  rc 
2c930 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
2c940 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
2c950 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
2c960 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66   &zWhere);..  if
2c970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c980 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
2c990 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44  zDir ){.      zD
2c9a0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
2c9b0 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d  intf("%s/", pAr-
2c9c0 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73  >zDir);.    }els
2c9d0 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  e{.      zDir = 
2c9e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c9f0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "");.    }.    i
2ca00 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20  f( zDir==0 ) rc 
2ca10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2ca20 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
2ca30 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
2ca40 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
2ca50 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45  Sql1, .      azE
2ca60 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69  xtraArg[pAr->bZi
2ca70 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62  p], pAr->zSrcTab
2ca80 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a  le, zWhere.  );.
2ca90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2caa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20  E_OK ){.    j = 
2cab0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2cac0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
2cad0 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20  l, "$dir");.    
2cae0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2caf0 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c  t(pSql, j, zDir,
2cb00 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
2cb10 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
2cb20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2cb30 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
2cb40 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
2cb50 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
2cb60 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
2cb70 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
2cb80 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
2cb90 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
2cba0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
2cbb0 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
2cbc0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
2cbd0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
2cbe0 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
2cbf0 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
2cc00 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
2cc10 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
2cc20 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
2cc30 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
2cc40 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
2cc50 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
2cc60 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
2cc70 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
2cc80 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
2cc90 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2cca0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
2ccb0 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20   "$dirOnly");.  
2ccc0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2ccd0 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29  _int(pSql, j, i)
2cce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
2ccf0 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
2cd00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2cd10 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2cd20 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
2cd30 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (pSql));.      }
2cd40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
2cd50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2cd60 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2cd70 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2cd80 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
2cd90 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41    if( i==0 && pA
2cda0 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  r->bVerbose ){. 
2cdb0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
2cdc0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2cdd0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
2cde0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2cdf0 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
2ce00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ce10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2ce20 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
2ce30 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
2ce40 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
2ce50 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
2ce60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
2ce70 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
2ce80 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
2ce90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2cea0 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
2ceb0 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c  tatement in zSql
2cec0 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61  .  Or if doing a
2ced0 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c   --dryrun, merel
2cee0 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a  y print it out..
2cef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2cf00 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e  ExecSql(ArComman
2cf10 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
2cf20 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
2cf30 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e   rc;.  if( pAr->
2cf40 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
2cf50 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2cf60 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2cf70 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
2cf80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2cf90 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  se{.    char *zE
2cfa0 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  rr = 0;.    rc =
2cfb0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
2cfc0 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  r->db, zSql, 0, 
2cfd0 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
2cfe0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
2cff0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d000 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c  out, "ERROR: %s\
2d010 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
2d020 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2d030 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rr);.    }.  }. 
2d040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2d050 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2d060 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65  tion of .ar "cre
2d070 61 74 65 22 2c 20 22 69 6e 73 65 72 74 22 2c 20  ate", "insert", 
2d080 61 6e 64 20 22 75 70 64 61 74 65 22 20 63 6f 6d  and "update" com
2d090 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mands..**.**    
2d0a0 20 63 72 65 61 74 65 20 20 20 20 2d 3e 20 20 20   create    ->   
2d0b0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
2d0c0 51 4c 20 61 72 63 68 69 76 65 0a 2a 2a 20 20 20  QL archive.**   
2d0d0 20 20 69 6e 73 65 72 74 20 20 20 20 2d 3e 20 20    insert    ->  
2d0e0 20 20 20 49 6e 73 65 72 74 20 6f 72 20 72 65 69     Insert or rei
2d0f0 6e 73 65 72 74 20 61 6c 6c 20 66 69 6c 65 73 20  nsert all files 
2d100 6c 69 73 74 65 64 0a 2a 2a 20 20 20 20 20 75 70  listed.**     up
2d110 64 61 74 65 20 20 20 20 2d 3e 20 20 20 20 20 49  date    ->     I
2d120 6e 73 65 72 74 20 66 69 6c 65 73 20 74 68 61 74  nsert files that
2d130 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 72   have changed or
2d140 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 2a   that were not.*
2d150 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2d160 20 20 20 20 20 20 20 70 72 65 76 69 6f 75 73 6c         previousl
2d170 79 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65  y in the archive
2d180 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  .**.** Create th
2d190 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  e "sqlar" table 
2d1a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d1b0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
2d1c0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a  lready exist..**
2d1d0 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20 66   Then add each f
2d1e0 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69 6c  ile in the azFil
2d1f0 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68 65  e[] array to the
2d200 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63 74   archive. Direct
2d210 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64 64  ories.** are add
2d220 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
2d230 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65 72  If argument bVer
2d240 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  bose is non-zero
2d250 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a 2a  , a message is.*
2d260 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64  * printed on std
2d270 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69 6c  out for each fil
2d280 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a 2a  e archived..**.*
2d290 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f 6d  * The create com
2d2a0 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d 65  mand is the same
2d2b0 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63 65   as update, exce
2d2c0 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70 73  pt that it drops
2d2d0 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e 67  .** any existing
2d2e0 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 62   "sqlar" table b
2d2f0 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 2e  efore beginning.
2d300 20 20 54 68 65 20 22 69 6e 73 65 72 74 22 20 63    The "insert" c
2d310 6f 6d 6d 61 6e 64 0a 2a 2a 20 61 6c 77 61 79 73  ommand.** always
2d320 20 6f 76 65 72 77 72 69 74 65 73 20 65 76 65 72   overwrites ever
2d330 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20  y file named on 
2d340 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
2d350 2c 20 77 68 65 72 65 20 61 73 0a 2a 2a 20 22 75  , where as.** "u
2d360 70 64 61 74 65 22 20 6f 6e 6c 79 20 6f 76 65 72  pdate" only over
2d370 77 72 69 74 65 73 20 69 66 20 74 68 65 20 73 69  writes if the si
2d380 7a 65 20 6f 72 20 6d 74 69 6d 65 20 6f 72 20 6d  ze or mtime or m
2d390 6f 64 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ode has changed.
2d3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2d3b0 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2d3c0 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d 6d  ommand(.  ArComm
2d3d0 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20 20  and *pAr,       
2d3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2d3f0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61  mand arguments a
2d400 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  nd options */.  
2d410 69 6e 74 20 62 55 70 64 61 74 65 2c 20 20 20 20  int bUpdate,    
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d430 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d 2d  /* true for a --
2d440 63 72 65 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74  create. */.  int
2d450 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67 65 64 20   bOnlyIfChanged 
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d470 4f 6e 6c 79 20 75 70 64 61 74 65 20 69 66 20 66  Only update if f
2d480 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
2d490 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
2d4a0 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20  ar *zCreate = . 
2d4b0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
2d4c0 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
2d4d0 20 73 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20   sqlar(\n".     
2d4e0 20 22 20 20 6e 61 6d 65 20 54 45 58 54 20 50 52   "  name TEXT PR
2d4f0 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e  IMARY KEY,  -- n
2d500 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 5c  ame of the file\
2d510 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 6f 64 65  n".      "  mode
2d520 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2d530 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65      -- access pe
2d540 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20  rmissions\n".   
2d550 20 20 20 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c     "  mtime INT,
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2d570 20 6c 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69   last modificati
2d580 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20  on time\n".     
2d590 20 22 20 20 73 7a 20 49 4e 54 2c 20 20 20 20 20   "  sz INT,     
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f              -- o
2d5b0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a  riginal file siz
2d5c0 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 64 61  e\n".      "  da
2d5d0 74 61 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20  ta BLOB         
2d5e0 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73        -- compres
2d5f0 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20  sed content\n". 
2d600 20 20 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73       ")";.  cons
2d610 74 20 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20  t char *zDrop = 
2d620 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
2d630 58 49 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20  XISTS sqlar";.  
2d640 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73  const char *zIns
2d650 65 72 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20  ertFmt[2] = {.  
2d660 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
2d670 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74   %s(name,mode,mt
2d680 69 6d 65 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a  ime,sz,data)\n".
2d690 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e       "  SELECT\n
2d6a0 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c  ".     "    %s,\
2d6b0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64  n".     "    mod
2d6c0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2d6d0 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22  mtime,\n".     "
2d6e0 20 20 20 20 43 41 53 45 20 73 75 62 73 74 72 28      CASE substr(
2d6f0 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31  lsmode(mode),1,1
2d700 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
2d710 20 57 48 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c   WHEN '-' THEN l
2d720 65 6e 67 74 68 28 64 61 74 61 29 5c 6e 22 0a 20  ength(data)\n". 
2d730 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e 20      "      WHEN 
2d740 27 64 27 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20  'd' THEN 0\n".  
2d750 20 20 20 22 20 20 20 20 20 20 45 4c 53 45 20 2d     "      ELSE -
2d760 31 20 45 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22  1 END,\n".     "
2d770 20 20 20 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65      sqlar_compre
2d780 73 73 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  ss(data)\n".    
2d790 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25   "  FROM fsdir(%
2d7a0 51 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22  Q,%Q) AS disk\n"
2d7b0 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c  .     "  WHERE l
2d7c0 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20  smode(mode) NOT 
2d7d0 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20  LIKE '?%%'%s;". 
2d7e0 20 20 20 20 2c 0a 20 20 20 20 20 22 52 45 50 4c      ,.     "REPL
2d7f0 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65  ACE INTO %s(name
2d800 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61  ,mode,mtime,data
2d810 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c  )\n".     "  SEL
2d820 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ECT\n".     "   
2d830 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20   %s,\n".     "  
2d840 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20    mode,\n".     
2d850 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20  "    mtime,\n". 
2d860 20 20 20 20 22 20 20 20 20 64 61 74 61 5c 6e 22      "    data\n"
2d870 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73  .     "  FROM fs
2d880 64 69 72 28 25 51 2c 25 51 29 20 41 53 20 64 69  dir(%Q,%Q) AS di
2d890 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  sk\n".     "  WH
2d8a0 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
2d8b0 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 25   NOT LIKE '?%%'%
2d8c0 73 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  s;".  };.  int i
2d8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2d8f0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
2d900 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a  ugh azFile[] */.
2d910 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d930 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d940 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d950 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
2d960 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 61 62        /* SQL tab
2d970 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  le into which to
2d980 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68 61   insert */.  cha
2d990 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
2d9a0 7a 54 65 6d 70 5b 35 30 5d 3b 0a 20 20 63 68 61  zTemp[50];.  cha
2d9b0 72 20 2a 7a 45 78 69 73 74 73 20 3d 20 30 3b 0a  r *zExists = 0;.
2d9c0 0a 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72  .  arExecSql(pAr
2d9d0 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  , "PRAGMA page_s
2d9e0 69 7a 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20  ize=512");.  rc 
2d9f0 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2da00 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22   "SAVEPOINT ar;"
2da10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2da20 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2da30 72 63 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  rc;.  zTemp[0] =
2da40 20 30 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e   0; .  if( pAr->
2da50 62 5a 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49  bZip ){.    /* I
2da60 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69  nitialize the zi
2da70 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61  pfile virtual ta
2da80 62 6c 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72  ble, if necessar
2da90 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72  y */.    if( pAr
2daa0 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ->zFile ){.     
2dab0 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
2dac0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2dad0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2dae0 6f 66 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20  of(r),&r);.     
2daf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2db00 66 28 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c  f(sizeof(zTemp),
2db10 7a 54 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c  zTemp,"zip%016ll
2db20 78 22 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61  x",r);.      zTa
2db30 62 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  b = zTemp;.     
2db40 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2db50 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2db60 20 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41    "CREATE VIRTUA
2db70 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20  L TABLE temp.%s 
2db80 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51  USING zipfile(%Q
2db90 29 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61  )",.         zTa
2dba0 62 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20  b, pAr->zFile.  
2dbb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20      );.      rc 
2dbc0 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2dbd0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
2dbe0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2dbf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2dc00 20 20 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b     zTab = "zip";
2dc10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2dc20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2dc30 65 20 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20  e the table for 
2dc40 61 6e 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20  an SQLAR */.    
2dc50 7a 54 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a  zTab = "sqlar";.
2dc60 20 20 20 20 69 66 28 20 62 55 70 64 61 74 65 3d      if( bUpdate=
2dc70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2dc80 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2dc90 7a 44 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  zDrop);.      if
2dca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dcb0 29 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72  ) goto end_ar_tr
2dcc0 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d  ansaction;.    }
2dcd0 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
2dce0 53 71 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65  Sql(pAr, zCreate
2dcf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 4f 6e  );.  }.  if( bOn
2dd00 6c 79 49 66 43 68 61 6e 67 65 64 20 29 7b 0a 20  lyIfChanged ){. 
2dd10 20 20 20 7a 45 78 69 73 74 73 20 3d 20 73 71 6c     zExists = sql
2dd20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2dd30 20 20 20 20 22 20 41 4e 44 20 4e 4f 54 20 45 58      " AND NOT EX
2dd40 49 53 54 53 28 22 0a 20 20 20 20 20 20 20 20 20  ISTS(".         
2dd50 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
2dd60 25 73 20 41 53 20 6d 65 6d 22 0a 20 20 20 20 20  %s AS mem".     
2dd70 20 20 20 20 20 22 20 57 48 45 52 45 20 6d 65 6d       " WHERE mem
2dd80 2e 6e 61 6d 65 3d 64 69 73 6b 2e 6e 61 6d 65 22  .name=disk.name"
2dd90 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44  .          " AND
2dda0 20 6d 65 6d 2e 6d 74 69 6d 65 3d 64 69 73 6b 2e   mem.mtime=disk.
2ddb0 6d 74 69 6d 65 22 0a 20 20 20 20 20 20 20 20 20  mtime".         
2ddc0 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 6f 64 65 3d   " AND mem.mode=
2ddd0 64 69 73 6b 2e 6d 6f 64 65 29 22 2c 20 7a 54 61  disk.mode)", zTa
2dde0 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
2ddf0 20 7a 45 78 69 73 74 73 20 3d 20 73 71 6c 69 74   zExists = sqlit
2de00 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a  e3_mprintf("");.
2de10 20 20 7d 0a 20 20 69 66 28 20 7a 45 78 69 73 74    }.  if( zExist
2de20 73 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  s==0 ) rc = SQLI
2de30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28  TE_NOMEM;.  for(
2de40 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
2de50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2de60 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  K; i++){.    cha
2de70 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c 69 74  r *zSql2 = sqlit
2de80 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e 73 65  e3_mprintf(zInse
2de90 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69 70 5d  rtFmt[pAr->bZip]
2dea0 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20 20 20  , zTab,.        
2deb0 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3f 20  pAr->bVerbose ? 
2dec0 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61  "shell_putsnl(na
2ded0 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c 0a 20  me)" : "name",. 
2dee0 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2def0 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69 72 2c  g[i], pAr->zDir,
2df00 20 7a 45 78 69 73 74 73 29 3b 0a 20 20 20 20 72   zExists);.    r
2df10 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2df20 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20 20 73  r, zSql2);.    s
2df30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2df40 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 74  2);.  }.end_ar_t
2df50 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 69 66  ransaction:.  if
2df60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2df70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ){.    sqlite3_e
2df80 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 22 52 4f  xec(pAr->db, "RO
2df90 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45  LLBACK TO ar; RE
2dfa0 4c 45 41 53 45 20 61 72 3b 22 2c 20 30 2c 20 30  LEASE ar;", 0, 0
2dfb0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
2dfc0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2dfd0 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53 45 20  l(pAr, "RELEASE 
2dfe0 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ar;");.    if( p
2dff0 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41 72 2d  Ar->bZip && pAr-
2e000 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  >zFile ){.      
2e010 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2e020 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54 41 42  printf("DROP TAB
2e030 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29 3b 0a  LE %s", zTemp);.
2e040 20 20 20 20 20 20 61 72 45 78 65 63 53 71 6c 28        arExecSql(
2e050 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  pAr, zSql);.    
2e060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e070 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sql);.    }.  }.
2e080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e090 45 78 69 73 74 73 29 3b 0a 20 20 72 65 74 75 72  Exists);.  retur
2e0a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
2e0b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2e0c0 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61   ".ar" dot comma
2e0d0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2e0e0 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  t arDotCommand(.
2e0f0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
2e100 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
2e110 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
2e120 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
2e130 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d 64 4c 69  .  int fromCmdLi
2e140 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
2e150 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 41     /* True if -A
2e160 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
2e170 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20 63 6d  tion, not .ar cm
2e180 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  d */.  char **az
2e190 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2e1a0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2e1b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
2e1c0 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
2e1d0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e200 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2e210 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
2e220 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20  ArCommand cmd;. 
2e230 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65   int rc;.  memse
2e240 74 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f  t(&cmd, 0, sizeo
2e250 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66  f(cmd));.  cmd.f
2e260 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f  romCmdLine = fro
2e270 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d  mCmdLine;.  rc =
2e280 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
2e290 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d  azArg, nArg, &cm
2e2a0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2e2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2e2c0 6e 74 20 65 44 62 54 79 70 65 20 3d 20 53 48 45  nt eDbType = SHE
2e2d0 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a  LL_OPEN_UNSPEC;.
2e2e0 20 20 20 20 63 6d 64 2e 70 20 3d 20 70 53 74 61      cmd.p = pSta
2e2f0 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d  te;.    cmd.db =
2e300 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20   pState->db;.   
2e310 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29   if( cmd.zFile )
2e320 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20  {.      eDbType 
2e330 3d 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65  = deduceDatabase
2e340 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  Type(cmd.zFile, 
2e350 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
2e360 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 70       eDbType = p
2e370 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b  State->openMode;
2e380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
2e390 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50  DbType==SHELL_OP
2e3a0 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
2e3b0 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
2e3c0 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  ==AR_CMD_EXTRACT
2e3d0 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52   || cmd.eCmd==AR
2e3e0 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20  _CMD_LIST ){.   
2e3f0 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69       if( cmd.zFi
2e400 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
2e410 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
2e420 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e430 74 66 28 22 7a 69 70 22 29 3b 0a 20 20 20 20 20  tf("zip");.     
2e440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e450 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c      cmd.zSrcTabl
2e460 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2e470 6e 74 66 28 22 7a 69 70 66 69 6c 65 28 25 51 29  ntf("zipfile(%Q)
2e480 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20  ", cmd.zFile);. 
2e490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e4a0 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a 69 70 20  .      cmd.bZip 
2e4b0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
2e4c0 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a  f( cmd.zFile ){.
2e4d0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b        int flags;
2e4e0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62  .      if( cmd.b
2e4f0 41 70 70 65 6e 64 20 29 20 65 44 62 54 79 70 65  Append ) eDbType
2e500 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50   = SHELL_OPEN_AP
2e510 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 69  PENDVFS;.      i
2e520 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
2e530 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d  CMD_CREATE || cm
2e540 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 49  d.eCmd==AR_CMD_I
2e550 4e 53 45 52 54 20 0a 20 20 20 20 20 20 20 20 20  NSERT .         
2e560 20 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41    || cmd.eCmd==A
2e570 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a  R_CMD_UPDATE ){.
2e580 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
2e590 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e5a0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2e5b0 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
2e5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2e5d0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
2e5e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2e5f0 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 64     }.      cmd.d
2e600 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
2e610 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29 7b 0a   cmd.bDryRun ){.
2e620 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2e630 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
2e640 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61 62 61   "-- open databa
2e650 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20 63 6d  se '%s'%s\n", cm
2e660 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  d.zFile,.       
2e670 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53        eDbType==S
2e680 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
2e690 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20 27 61  VFS ? " using 'a
2e6a0 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29 3b 0a  pndvfs'" : "");.
2e6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2e6c0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
2e6d0 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 63  v2(cmd.zFile, &c
2e6e0 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20 0a 20  md.db, flags, . 
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54              eDbT
2e700 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
2e710 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61 70 6e  APPENDVFS ? "apn
2e720 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20 20 20  dvfs" : 0);.    
2e730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2e750 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e760 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
2e770 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c 6e 22  file: %s (%s)\n"
2e780 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  , .            c
2e790 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  md.zFile, sqlite
2e7a0 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64 62 29  3_errmsg(cmd.db)
2e7b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2e7c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f      goto end_ar_
2e7d0 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d  command;.      }
2e7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e7f0 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64 2e 64  ileio_init(cmd.d
2e800 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
2e810 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e  sqlite3_sqlar_in
2e820 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29  it(cmd.db, 0, 0)
2e830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2e840 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2e850 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c 5f 70  cmd.db, "shell_p
2e860 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54  utsnl", 1, SQLIT
2e870 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c 0a 20  E_UTF8, cmd.p,. 
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
2e8a0 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30  llPutsFunc, 0, 0
2e8b0 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  );..    }.    if
2e8c0 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 3d  ( cmd.zSrcTable=
2e8d0 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70 3d 3d  =0 && cmd.bZip==
2e8e0 30 20 26 26 20 63 6d 64 2e 65 43 6d 64 21 3d 41  0 && cmd.eCmd!=A
2e8f0 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b 0a 20 20  R_CMD_HELP ){.  
2e900 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
2e910 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 0a  !=AR_CMD_CREATE.
2e920 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
2e930 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
2e940 65 74 61 64 61 74 61 28 63 6d 64 2e 64 62 2c 30  etadata(cmd.db,0
2e950 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d 65 22 2c  ,"sqlar","name",
2e960 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20  0,0,0,0,0).     
2e970 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2e980 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e990 22 64 61 74 61 62 61 73 65 20 64 6f 65 73 20 6e  "database does n
2e9a0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 27 73  ot contain an 's
2e9b0 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e 22 29 3b  qlar' table\n");
2e9c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2e9d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2e9e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f      goto end_ar_
2e9f0 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d  command;.      }
2ea00 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54  .      cmd.zSrcT
2ea10 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
2ea20 70 72 69 6e 74 66 28 22 73 71 6c 61 72 22 29 3b  printf("sqlar");
2ea30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
2ea40 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a  ch( cmd.eCmd ){.
2ea50 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
2ea60 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 20 20  D_CREATE:.      
2ea70 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f    rc = arCreateO
2ea80 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26  rUpdateCommand(&
2ea90 63 6d 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cmd, 0, 0);.    
2eaa0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2eab0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58    case AR_CMD_EX
2eac0 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72  TRACT:.        r
2ead0 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d  c = arExtractCom
2eae0 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
2eaf0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2eb00 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
2eb10 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ST:.        rc =
2eb20 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26   arListCommand(&
2eb30 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
2eb40 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2eb50 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
2eb60 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53        arUsage(pS
2eb70 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
2eb80 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2eb90 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e    case AR_CMD_IN
2eba0 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 72 63  SERT:.        rc
2ebb0 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
2ebc0 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
2ebd0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
2ebe0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65  break;..      de
2ebf0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61  fault:.        a
2ec00 73 73 65 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d  ssert( cmd.eCmd=
2ec10 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
2ec20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
2ec30 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2ec40 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20  ommand(&cmd, 1, 
2ec50 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
2ec60 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  k;.    }.  }.end
2ec70 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69  _ar_command:.  i
2ec80 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61 74  f( cmd.db!=pStat
2ec90 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f  e->db ){.    clo
2eca0 73 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20  se_db(cmd.db);. 
2ecb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2ecc0 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29  e(cmd.zSrcTable)
2ecd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2ece0 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
2ecf0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
2ed00 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69  ar" command logi
2ed10 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c.**************
2ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed60 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
2ed70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ed80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ed90 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2eda0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
2edb0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
2edc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2edd0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
2ede0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2edf0 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29  BLE_DBPAGE_VTAB)
2ee00 0a 2f 2a 0a 2a 2a 20 49 66 20 28 2a 70 52 63 29  ./*.** If (*pRc)
2ee10 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
2ee20 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2ee30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2ee40 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
2ee50 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
2ee60 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f   SQL statement o
2ee70 72 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  r statements in 
2ee80 7a 53 71 6c 20 61 72 65 20 65 78 65 63 75 74 65  zSql are execute
2ee90 64 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  d using.** datab
2eea0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
2eeb0 62 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  b and the error 
2eec0 63 6f 64 65 20 77 72 69 74 74 65 6e 20 74 6f 20  code written to 
2eed0 2a 70 52 63 20 62 65 66 6f 72 65 0a 2a 2a 20 74  *pRc before.** t
2eee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2eef0 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
2ef00 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63 28 73  void shellExec(s
2ef10 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2ef20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
2ef30 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
2ef40 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66 28 20  c = *pRc;.  if( 
2ef50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ef60 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20  .    char *zErr 
2ef70 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
2ef80 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
2ef90 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
2efa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2efb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2efc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2efd0 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
2efe0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
2eff0 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20     }.    *pRc = 
2f000 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
2f010 20 4c 69 6b 65 20 73 68 65 6c 6c 45 78 65 63 28   Like shellExec(
2f020 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 7a  ), except that z
2f030 46 6d 74 20 69 73 20 61 20 70 72 69 6e 74 66 28  Fmt is a printf(
2f040 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73  ) style format s
2f050 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
2f060 20 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63 50   void shellExecP
2f070 72 69 6e 74 66 28 73 71 6c 69 74 65 33 20 2a 64  rintf(sqlite3 *d
2f080 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e  b, int *pRc, con
2f090 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
2f0a0 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  ..){.  char *z =
2f0b0 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
2f0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f0d0 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
2f0e0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2f0f0 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  mt);.    z = sql
2f100 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2f110 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  mt, ap);.    va_
2f120 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28  end(ap);.    if(
2f130 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a   z==0 ){.      *
2f140 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2f150 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2f160 20 20 20 20 20 73 68 65 6c 6c 45 78 65 63 28 64       shellExec(d
2f170 62 2c 20 70 52 63 2c 20 7a 29 3b 0a 20 20 20 20  b, pRc, z);.    
2f180 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2f190 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(z);.  }.}../*
2f1a0 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e  .** If *pRc is n
2f1b0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
2f1c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f1d0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2f1e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
2f1f0 65 72 77 69 73 65 2c 20 61 6e 20 61 74 74 65 6d  erwise, an attem
2f200 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 6c  pt is made to al
2f210 6c 6f 63 61 74 65 2c 20 7a 65 72 6f 20 61 6e 64  locate, zero and
2f220 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2f230 72 0a 2a 2a 20 74 6f 20 61 20 62 75 66 66 65 72  r.** to a buffer
2f240 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20   nByte bytes in 
2f250 73 69 7a 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  size. If an OOM 
2f260 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2f270 52 63 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  Rc is set.** to 
2f280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
2f290 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a   NULL returned..
2f2a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
2f2b0 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 69 6e 74 20  shellMalloc(int 
2f2c0 2a 70 52 63 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pRc, sqlite3_in
2f2d0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  t64 nByte){.  vo
2f2e0 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  id *pRet = 0;.  
2f2f0 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2f300 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20  _OK ){.    pRet 
2f310 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2f320 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
2f330 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
2f340 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
2f350 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2f360 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
2f370 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29  (pRet, 0, nByte)
2f380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f390 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
2f3a0 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e  .** If *pRc is n
2f3b0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
2f3c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f3d0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2f3e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
2f3f0 65 72 77 69 73 65 2c 20 7a 46 6d 74 20 69 73 20  erwise, zFmt is 
2f400 74 72 65 61 74 65 64 20 61 73 20 61 20 70 72 69  treated as a pri
2f410 6e 74 66 28 29 20 73 74 79 6c 65 20 73 74 72 69  ntf() style stri
2f420 6e 67 2e 20 54 68 65 20 72 65 73 75 6c 74 20 6f  ng. The result o
2f430 66 0a 2a 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20  f.** formatting 
2f440 69 74 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e  it along with an
2f450 79 20 74 72 61 69 6c 69 6e 67 20 61 72 67 75 6d  y trailing argum
2f460 65 6e 74 73 20 69 73 20 77 72 69 74 74 65 6e 20  ents is written 
2f470 69 6e 74 6f 20 61 20 0a 2a 2a 20 62 75 66 66 65  into a .** buffe
2f480 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  r obtained from 
2f490 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2f4a0 2c 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 74 6f  , and pointer to
2f4b0 20 77 68 69 63 68 20 69 73 20 72 65 74 75 72 6e   which is return
2f4c0 65 64 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ed..** It is the
2f4d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2f4e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
2f4f0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
2f500 20 74 68 69 73 20 62 75 66 66 65 72 0a 2a 2a 20   this buffer.** 
2f510 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
2f520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
2f530 2a 2a 20 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  ** .** If an OOM
2f540 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 28   error occurs, (
2f550 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
2f560 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
2f570 20 61 20 4e 55 4c 4c 20 0a 2a 2a 20 70 6f 69 6e   a NULL .** poin
2f580 74 65 72 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ter returned..*/
2f590 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
2f5a0 65 6c 6c 4d 50 72 69 6e 74 66 28 69 6e 74 20 2a  ellMPrintf(int *
2f5b0 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
2f5c0 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  *zFmt, ...){.  c
2f5d0 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
2f5e0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2f5f0 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
2f600 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   ap;.    va_star
2f610 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2f620 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
2f630 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
2f640 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
2f650 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
2f660 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
2f670 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f680 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
2f690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
2f6a0 72 75 6e 6e 69 6e 67 20 74 68 65 20 22 2e 72 65  running the ".re
2f6b0 63 6f 76 65 72 22 20 63 6f 6d 6d 61 6e 64 2c 20  cover" command, 
2f6c0 65 61 63 68 20 6f 75 74 70 75 74 20 74 61 62 6c  each output tabl
2f6d0 65 2c 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  e, and the speci
2f6e0 61 6c 0a 2a 2a 20 6f 72 70 68 61 6e 65 64 20 72  al.** orphaned r
2f6f0 6f 77 20 74 61 62 6c 65 20 69 66 20 69 74 20 69  ow table if it i
2f700 73 20 72 65 71 75 69 72 65 64 2c 20 69 73 20 72  s required, is r
2f710 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e  epresented by an
2f720 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
2f730 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f740 72 75 63 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ruct..*/.typedef
2f750 20 73 74 72 75 63 74 20 52 65 63 6f 76 65 72 54   struct RecoverT
2f760 61 62 6c 65 20 52 65 63 6f 76 65 72 54 61 62 6c  able RecoverTabl
2f770 65 3b 0a 73 74 72 75 63 74 20 52 65 63 6f 76 65  e;.struct Recove
2f780 72 54 61 62 6c 65 20 7b 0a 20 20 63 68 61 72 20  rTable {.  char 
2f790 2a 7a 51 75 6f 74 65 64 3b 20 20 20 20 20 20 20  *zQuoted;       
2f7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2f7b0 6f 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  oted version of 
2f7c0 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
2f7d0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2f800 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f  umns in table */
2f810 0a 20 20 63 68 61 72 20 2a 2a 61 7a 6c 43 6f 6c  .  char **azlCol
2f820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f830 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
2f840 6f 6c 75 6d 6e 20 6c 69 73 74 73 20 2a 2f 0a 20  olumn lists */. 
2f850 20 69 6e 74 20 69 50 6b 3b 20 20 20 20 20 20 20   int iPk;       
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f870 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 49 50 4b   /* Index of IPK
2f880 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 0a 2f   column */.};../
2f890 2a 0a 2a 2a 20 46 72 65 65 20 61 20 52 65 63 6f  *.** Free a Reco
2f8a0 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  verTable object 
2f8b0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 65 63  allocated by rec
2f8c0 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28 29 20  overFindTable() 
2f8d0 6f 72 0a 2a 2a 20 72 65 63 6f 76 65 72 4f 72 70  or.** recoverOrp
2f8e0 68 61 6e 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 73  hanTable()..*/.s
2f8f0 74 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 76  tatic void recov
2f900 65 72 46 72 65 65 54 61 62 6c 65 28 52 65 63 6f  erFreeTable(Reco
2f910 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  verTable *pTab){
2f920 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
2f930 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f940 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 29 3b 0a  pTab->zQuoted);.
2f950 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 7a      if( pTab->az
2f960 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  lCol ){.      in
2f970 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
2f980 3d 30 3b 20 69 3c 3d 70 54 61 62 2d 3e 6e 43 6f  =0; i<=pTab->nCo
2f990 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
2f9a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
2f9b0 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 29 3b 0a  ab->azlCol[i]);.
2f9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2f9d0 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d  lite3_free(pTab-
2f9e0 3e 61 7a 6c 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  >azlCol);.    }.
2f9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2fa00 28 70 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pTab);.  }.}../
2fa10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fa20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
2fa30 20 28 2a 70 52 63 29 20 69 73 20 6e 6f 74 20 53   (*pRc) is not S
2fa40 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74  QLITE_OK when it
2fa50 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f   is called..** O
2fa60 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 6c 6c  therwise, it all
2fa70 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
2fa80 6e 73 20 61 20 52 65 63 6f 76 65 72 54 61 62 6c  ns a RecoverTabl
2fa90 65 20 6f 62 6a 65 63 74 20 62 61 73 65 64 20 6f  e object based o
2faa0 6e 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 66  n the.** final f
2fab0 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 70 61  our arguments pa
2fac0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2fad0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65  ction. It is the
2fae0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
2faf0 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ** of the caller
2fb00 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
2fb10 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65 64  ree the returned
2fb20 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a   object using.**
2fb30 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
2fb40 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  e()..*/.static R
2fb50 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63  ecoverTable *rec
2fb60 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 0a 20 20  overNewTable(.  
2fb70 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb90 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
2fba0 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
2fbb0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2fbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2fbd0 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  me of table */. 
2fbe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2fbf0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
2fc00 20 2f 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   /* CREATE TABLE
2fc10 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
2fc20 69 6e 74 20 62 49 6e 74 6b 65 79 2c 20 0a 20 20  int bIntkey, .  
2fc30 69 6e 74 20 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71  int nCol.){.  sq
2fc40 6c 69 74 65 33 20 2a 64 62 74 6d 70 20 3d 20 30  lite3 *dbtmp = 0
2fc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2fc60 20 73 71 6c 69 74 65 33 20 68 61 6e 64 6c 65 20   sqlite3 handle 
2fc70 66 6f 72 20 74 65 73 74 69 6e 67 20 43 52 45 41  for testing CREA
2fc80 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 69 6e  TE TABLE */.  in
2fc90 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 52  t rc = *pRc;.  R
2fca0 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61  ecoverTable *pTa
2fcb0 62 20 3d 20 30 3b 0a 0a 20 20 70 54 61 62 20 3d  b = 0;..  pTab =
2fcc0 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29   (RecoverTable*)
2fcd0 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c  shellMalloc(&rc,
2fce0 20 73 69 7a 65 6f 66 28 52 65 63 6f 76 65 72 54   sizeof(RecoverT
2fcf0 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 72 63  able));.  if( rc
2fd00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fd10 20 20 20 69 6e 74 20 6e 53 71 6c 43 6f 6c 20 3d     int nSqlCol =
2fd20 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 53 71 6c   0;.    int bSql
2fd30 49 6e 74 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  Intkey = 0;.    
2fd40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2fd50 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  tmt = 0;.    .  
2fd60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
2fd70 70 65 6e 28 22 22 2c 20 26 64 62 74 6d 70 29 3b  pen("", &dbtmp);
2fd80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2fd90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fda0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2fdb0 63 28 64 62 74 6d 70 2c 20 22 50 52 41 47 4d 41  c(dbtmp, "PRAGMA
2fdc0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
2fdd0 20 3d 20 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29   = on", 0, 0, 0)
2fde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fdf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fe00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2fe10 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20  te3_exec(dbtmp, 
2fe20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2fe30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fe40 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20  LITE_ERROR ){.  
2fe50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fe60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  E_OK;.        go
2fe70 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  to finished;.   
2fe80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2fe90 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2fea0 66 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70  f(dbtmp, &rc, &p
2feb0 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 22  Stmt, .        "
2fec0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2fed0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c  FROM pragma_tabl
2fee0 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 7a 4e 61  e_info(%Q)", zNa
2fef0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
2ff00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ff10 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2ff20 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2ff30 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 53 71 6c  t) ){.      nSql
2ff40 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
2ff50 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2ff60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  0);.    }.    sh
2ff70 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
2ff80 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66   pStmt);..    if
2ff90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ffa0 7c 7c 20 6e 53 71 6c 43 6f 6c 3c 6e 43 6f 6c 20  || nSqlCol<nCol 
2ffb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69  ){.      goto fi
2ffc0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
2ffd0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
2ffe0 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63  rintf(dbtmp, &rc
2fff0 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20  , &pStmt, .     
30000 20 22 53 45 4c 45 43 54 20 28 22 0a 20 20 20 20   "SELECT (".    
30010 20 20 22 20 20 53 45 4c 45 43 54 20 73 75 62 73    "  SELECT subs
30020 74 72 28 64 61 74 61 2c 31 2c 31 29 3d 3d 58 27  tr(data,1,1)==X'
30030 30 44 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  0D' FROM sqlite_
30040 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e  dbpage WHERE pgn
30050 6f 3d 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20  o=rootpage".    
30060 20 20 22 29 20 46 52 4f 4d 20 73 71 6c 69 74 65    ") FROM sqlite
30070 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61  _master WHERE na
30080 6d 65 20 3d 20 25 51 22 2c 20 7a 4e 61 6d 65 0a  me = %Q", zName.
30090 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
300a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
300b0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
300c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
300d0 29 7b 0a 20 20 20 20 20 20 62 53 71 6c 49 6e 74  ){.      bSqlInt
300e0 6b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  key = sqlite3_co
300f0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
30100 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  0);.    }.    sh
30110 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
30120 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66   pStmt);..    if
30130 28 20 62 49 6e 74 6b 65 79 3d 3d 62 53 71 6c 49  ( bIntkey==bSqlI
30140 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 69  ntkey ){.      i
30150 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt i;.      cons
30160 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22 5f  t char *zPk = "_
30170 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20 20 73  rowid_";.      s
30180 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 6b  qlite3_stmt *pPk
30190 46 69 6e 64 65 72 20 3d 20 30 3b 0a 0a 20 20 20  Finder = 0;..   
301a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
301b0 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
301c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
301d0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
301e0 20 4b 45 59 2c 0a 20 20 20 20 20 20 2a 2a 20 73   KEY,.      ** s
301f0 65 74 20 7a 50 6b 20 74 6f 20 74 68 65 20 6e 61  et zPk to the na
30200 6d 65 20 6f 66 20 74 68 65 20 50 4b 20 63 6f 6c  me of the PK col
30210 75 6d 6e 2c 20 61 6e 64 20 70 54 61 62 2d 3e 69  umn, and pTab->i
30220 50 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  Pk to the index.
30230 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
30240 63 6f 6c 75 6d 6e 2c 20 77 68 65 72 65 20 63 6f  column, where co
30250 6c 75 6d 6e 73 20 61 72 65 20 30 2d 6e 75 6d 62  lumns are 0-numb
30260 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74  ered from left t
30270 6f 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 2a  o right..      *
30280 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  * Or, if this is
30290 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
302a0 20 74 61 62 6c 65 20 6f 72 20 69 66 20 74 68 65   table or if the
302b0 72 65 20 69 73 20 6e 6f 20 49 50 4b 20 63 6f 6c  re is no IPK col
302c0 75 6d 6e 2c 0a 20 20 20 20 20 20 2a 2a 20 6c 65  umn,.      ** le
302d0 61 76 65 20 7a 50 6b 20 61 73 20 22 5f 72 6f 77  ave zPk as "_row
302e0 69 64 5f 22 20 61 6e 64 20 70 54 61 62 2d 3e 69  id_" and pTab->i
302f0 50 6b 20 61 74 20 2d 32 2e 20 20 2a 2f 0a 20 20  Pk at -2.  */.  
30300 20 20 20 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20      pTab->iPk = 
30310 2d 32 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  -2;.      if( bI
30320 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntkey ){.       
30330 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
30340 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c 20  ntf(dbtmp, &rc, 
30350 26 70 50 6b 46 69 6e 64 65 72 2c 20 0a 20 20 20  &pPkFinder, .   
30360 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
30370 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72  id, name FROM pr
30380 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28  agma_table_info(
30390 25 51 29 20 22 0a 20 20 20 20 20 20 20 20 20 20  %Q) ".          
303a0 22 20 20 57 48 45 52 45 20 70 6b 3d 31 20 41 4e  "  WHERE pk=1 AN
303b0 44 20 74 79 70 65 3d 27 69 6e 74 65 67 65 72 27  D type='integer'
303c0 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
303d0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
303e0 44 20 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45  D NOT EXISTS (SE
303f0 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20 70 72  LECT cid FROM pr
30400 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28  agma_table_info(
30410 25 51 29 20 57 48 45 52 45 20 70 6b 3d 32 29 22  %Q) WHERE pk=2)"
30420 0a 20 20 20 20 20 20 20 20 20 20 2c 20 7a 4e 61  .          , zNa
30430 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  me, zName.      
30440 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
30450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30460 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
30470 6c 69 74 65 33 5f 73 74 65 70 28 70 50 6b 46 69  lite3_step(pPkFi
30480 6e 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  nder) ){.       
30490 20 20 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 73     pTab->iPk = s
304a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
304b0 74 28 70 50 6b 46 69 6e 64 65 72 2c 20 30 29 3b  t(pPkFinder, 0);
304c0 0a 20 20 20 20 20 20 20 20 20 20 7a 50 6b 20 3d  .          zPk =
304d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
304e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
304f0 74 28 70 50 6b 46 69 6e 64 65 72 2c 20 31 29 3b  t(pPkFinder, 1);
30500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30510 20 7d 0a 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   }..      pTab->
30520 7a 51 75 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d  zQuoted = shellM
30530 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25 51 22  Printf(&rc, "%Q"
30540 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
30550 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28  pTab->azlCol = (
30560 63 68 61 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c  char**)shellMall
30570 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 63  oc(&rc, sizeof(c
30580 68 61 72 2a 29 20 2a 20 28 6e 53 71 6c 43 6f 6c  har*) * (nSqlCol
30590 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62  +1));.      pTab
305a0 2d 3e 6e 43 6f 6c 20 3d 20 6e 53 71 6c 43 6f 6c  ->nCol = nSqlCol
305b0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ;..      if( bIn
305c0 74 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tkey ){.        
305d0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 20  pTab->azlCol[0] 
305e0 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26  = shellMPrintf(&
305f0 72 63 2c 20 22 25 51 22 2c 20 7a 50 6b 29 3b 0a  rc, "%Q", zPk);.
30600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30610 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f       pTab->azlCo
30620 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69  l[0] = shellMPri
30630 6e 74 66 28 26 72 63 2c 20 22 22 29 3b 0a 20 20  ntf(&rc, "");.  
30640 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
30650 31 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72  1;.      shellPr
30660 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d  eparePrintf(dbtm
30670 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20  p, &rc, &pStmt, 
30680 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
30690 43 54 20 25 51 20 7c 7c 20 67 72 6f 75 70 5f 63  CT %Q || group_c
306a0 6f 6e 63 61 74 28 6e 61 6d 65 2c 20 27 2c 20 27  oncat(name, ', '
306b0 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ) ".          " 
306c0 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20 63   FILTER (WHERE c
306d0 69 64 21 3d 25 64 29 20 4f 56 45 52 20 28 4f 52  id!=%d) OVER (OR
306e0 44 45 52 20 42 59 20 25 73 20 63 69 64 29 20 22  DER BY %s cid) "
306f0 0a 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d  .          "FROM
30700 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
30710 66 6f 28 25 51 29 22 2c 20 0a 20 20 20 20 20 20  fo(%Q)", .      
30720 20 20 20 20 62 49 6e 74 6b 65 79 20 3f 20 22 2c      bIntkey ? ",
30730 20 22 20 3a 20 22 22 2c 20 70 54 61 62 2d 3e 69   " : "", pTab->i
30740 50 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 62  Pk, .          b
30750 49 6e 74 6b 65 79 20 3f 20 22 22 20 3a 20 22 28  Intkey ? "" : "(
30760 43 41 53 45 20 57 48 45 4e 20 70 6b 3d 30 20 54  CASE WHEN pk=0 T
30770 48 45 4e 20 31 30 30 30 30 30 30 20 45 4c 53 45  HEN 1000000 ELSE
30780 20 70 6b 20 45 4e 44 29 2c 20 22 2c 0a 20 20 20   pk END), ",.   
30790 20 20 20 20 20 20 20 7a 4e 61 6d 65 0a 20 20 20         zName.   
307a0 20 20 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c     );.      whil
307b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
307c0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
307d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
307e0 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mt) ){.        c
307f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
30800 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
30810 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
30820 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
30830 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
30840 43 6f 6c 5b 69 5d 20 3d 20 73 68 65 6c 6c 4d 50  Col[i] = shellMP
30850 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73 25 73  rintf(&rc, "%s%s
30860 22 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b  ", pTab->azlCol[
30870 30 5d 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  0], zText);.    
30880 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
30890 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61  .      shellFina
308a0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
308b0 3b 0a 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69  ;..      shellFi
308c0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50 6b 46  nalize(&rc, pPkF
308d0 69 6e 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  inder);.    }.  
308e0 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
308f0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
30900 74 6d 70 29 3b 0a 20 20 2a 70 52 63 20 3d 20 72  tmp);.  *pRc = r
30910 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
30920 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 54 61 62 20  ITE_OK || (pTab 
30930 26 26 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64  && pTab->zQuoted
30940 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 63 6f  ==0) ){.    reco
30950 76 65 72 46 72 65 65 54 61 62 6c 65 28 70 54 61  verFreeTable(pTa
30960 62 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 30  b);.    pTab = 0
30970 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
30980 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
30990 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
309a0 61 6c 6c 65 64 20 74 6f 20 73 65 61 72 63 68 20  alled to search 
309b0 74 68 65 20 73 63 68 65 6d 61 20 72 65 63 6f 76  the schema recov
309c0 65 72 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ered from the.**
309d0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
309e0 61 62 6c 65 20 6f 66 20 74 68 65 20 28 70 6f 73  able of the (pos
309f0 73 69 62 6c 79 29 20 63 6f 72 72 75 70 74 20 64  sibly) corrupt d
30a00 61 74 61 62 61 73 65 20 61 73 20 70 61 72 74 0a  atabase as part.
30a10 2a 2a 20 6f 66 20 61 20 22 2e 72 65 63 6f 76 65  ** of a ".recove
30a20 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 70 65 63  r" command. Spec
30a30 69 66 69 63 61 6c 6c 79 2c 20 66 6f 72 20 61 20  ifically, for a 
30a40 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
30a50 70 61 67 65 0a 2a 2a 20 69 52 6f 6f 74 20 61 6e  page.** iRoot an
30a60 64 20 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20  d at least nCol 
30a70 63 6f 6c 75 6d 6e 73 2e 20 41 64 64 69 74 69 6f  columns. Additio
30a80 6e 61 6c 6c 79 2c 20 69 66 20 62 49 6e 74 6b 65  nally, if bIntke
30a90 79 20 69 73 20 30 2c 20 74 68 65 0a 2a 2a 20 74  y is 0, the.** t
30aa0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 57  able must be a W
30ab0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
30ac0 6c 65 2c 20 6f 72 20 69 66 20 6e 6f 6e 2d 7a 65  le, or if non-ze
30ad0 72 6f 2c 20 6e 6f 74 20 6f 6e 65 20 6f 66 0a 2a  ro, not one of.*
30ae0 2a 20 74 68 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  * those..**.** I
30af0 66 20 61 20 74 61 62 6c 65 20 69 73 20 66 6f 75  f a table is fou
30b00 6e 64 2c 20 61 20 28 52 65 63 6f 76 65 72 54 61  nd, a (RecoverTa
30b10 62 6c 65 2a 29 20 6f 62 6a 65 63 74 20 69 73 20  ble*) object is 
30b20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
30b30 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  .** no such tabl
30b40 65 20 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20  e is found, but 
30b50 62 49 6e 74 6b 65 79 20 69 73 20 66 61 6c 73 65  bIntkey is false
30b60 20 61 6e 64 20 69 52 6f 6f 74 20 69 73 20 74 68   and iRoot is th
30b70 65 20 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  e .** root page 
30b80 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 74  of an index in t
30b90 68 65 20 72 65 63 6f 76 65 72 65 64 20 73 63 68  he recovered sch
30ba0 65 6d 61 2c 20 74 68 65 6e 20 28 2a 70 62 4e 6f  ema, then (*pbNo
30bb0 6f 70 29 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  op) is.** set to
30bc0 20 74 72 75 65 20 61 6e 64 20 4e 55 4c 4c 20 72   true and NULL r
30bd0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
30be0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
30bf0 20 74 61 62 6c 65 20 6f 72 0a 2a 2a 20 69 6e 64   table or.** ind
30c00 65 78 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ex, NULL is retu
30c10 72 6e 65 64 20 61 6e 64 20 28 2a 70 62 4e 6f 6f  rned and (*pbNoo
30c20 70 29 20 73 65 74 20 74 6f 20 30 2c 20 69 6e 64  p) set to 0, ind
30c30 69 63 61 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  icating that.** 
30c40 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
30c50 64 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  d write data to 
30c60 74 68 65 20 6f 72 70 68 61 6e 73 20 74 61 62 6c  the orphans tabl
30c70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63  e..*/.static Rec
30c80 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76  overTable *recov
30c90 65 72 46 69 6e 64 54 61 62 6c 65 28 0a 20 20 53  erFindTable(.  S
30ca0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
30cb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
30cc0 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62  * Shell state ob
30cd0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
30ce0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
30cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
30d00 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
30d10 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 6f 74 2c 20  */.  int iRoot, 
30d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d30 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
30d40 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20  e of table */.  
30d50 69 6e 74 20 62 49 6e 74 6b 65 79 2c 20 20 20 20  int bIntkey,    
30d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d70 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 69  /* True for an i
30d80 6e 74 6b 65 79 20 74 61 62 6c 65 20 2a 2f 0a 20  ntkey table */. 
30d90 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
30dc0 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a  lumns in table *
30dd0 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 6f 6f 70 20  /.  int *pbNoop 
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30df0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
30e00 20 69 66 20 69 52 6f 6f 74 20 69 73 20 72 6f 6f   if iRoot is roo
30e10 74 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  t of index */.){
30e20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
30e30 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 52 65  *pStmt = 0;.  Re
30e40 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 52 65 74  coverTable *pRet
30e50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 4e 6f 6f   = 0;.  int bNoo
30e60 70 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  p = 0;.  const c
30e70 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
30e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
30e90 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  me = 0;..  /* Se
30ea0 61 72 63 68 20 74 68 65 20 72 65 63 6f 76 65 72  arch the recover
30eb0 65 64 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6e  ed schema for an
30ec0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 72 6f 6f   object with roo
30ed0 74 20 70 61 67 65 20 69 52 6f 6f 74 2e 20 2a 2f  t page iRoot. */
30ee0 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  .  shellPrepareP
30ef0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
30f00 2c 20 70 52 63 2c 20 26 70 53 74 6d 74 2c 0a 20  , pRc, &pStmt,. 
30f10 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70       "SELECT typ
30f20 65 2c 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  e, name, sql FRO
30f30 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
30f40 61 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65  a WHERE rootpage
30f50 3d 25 64 22 2c 20 69 52 6f 6f 74 0a 20 20 29 3b  =%d", iRoot.  );
30f60 0a 20 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d  .  while( *pRc==
30f70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
30f80 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
30f90 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
30fa0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30fb0 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63  zType = (const c
30fc0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
30fd0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
30fe0 30 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 74  0);.    if( bInt
30ff0 6b 65 79 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  key==0 && sqlite
31000 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c  3_stricmp(zType,
31010 20 22 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a   "index")==0 ){.
31020 20 20 20 20 20 20 62 4e 6f 6f 70 20 3d 20 31 3b        bNoop = 1;
31030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31040 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
31050 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70  te3_stricmp(zTyp
31060 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29  e, "table")==0 )
31070 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
31080 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31090 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
310a0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
310b0 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20    zSql = (const 
310c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
310d0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
310e0 20 32 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20   2);.      pRet 
310f0 3d 20 72 65 63 6f 76 65 72 4e 65 77 54 61 62 6c  = recoverNewTabl
31100 65 28 70 52 63 2c 20 7a 4e 61 6d 65 2c 20 7a 53  e(pRc, zName, zS
31110 71 6c 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f  ql, bIntkey, nCo
31120 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
31130 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68  .    }.  }..  sh
31140 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c  ellFinalize(pRc,
31150 20 70 53 74 6d 74 29 3b 0a 20 20 2a 70 62 4e 6f   pStmt);.  *pbNo
31160 6f 70 20 3d 20 62 4e 6f 6f 70 3b 0a 20 20 72 65  op = bNoop;.  re
31170 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
31180 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 52 65 63  .** Return a Rec
31190 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74  overTable object
311a0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
311b0 65 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e  e orphans table.
311c0 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76  .*/.static Recov
311d0 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72  erTable *recover
311e0 4f 72 70 68 61 6e 54 61 62 6c 65 28 0a 20 20 53  OrphanTable(.  S
311f0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
31200 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31210 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62  * Shell state ob
31220 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
31230 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
31240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
31250 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
31260 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31270 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20  *zLostAndFound, 
31280 20 20 20 20 20 2f 2a 20 42 61 73 65 20 6e 61 6d       /* Base nam
31290 65 20 66 6f 72 20 6f 72 70 68 61 6e 73 20 74 61  e for orphans ta
312a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
312b0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
312c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
312d0 65 72 20 6f 66 20 75 73 65 72 20 64 61 74 61 20  er of user data 
312e0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20  columns */.){.  
312f0 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54  RecoverTable *pT
31300 61 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 43  ab = 0;.  if( nC
31310 6f 6c 3e 3d 30 20 26 26 20 2a 70 52 63 3d 3d 53  ol>=0 && *pRc==S
31320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31330 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54  int i;..    /* T
31340 68 69 73 20 62 6c 6f 63 6b 20 64 65 74 65 72 6d  his block determ
31350 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ines the name of
31360 20 74 68 65 20 6f 72 70 68 61 6e 20 74 61 62 6c   the orphan tabl
31370 65 2e 20 54 68 65 20 70 72 65 66 65 72 65 64 0a  e. The prefered.
31380 20 20 20 20 2a 2a 20 6e 61 6d 65 20 69 73 20 7a      ** name is z
31390 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2e 20 42 75  LostAndFound. Bu
313a0 74 20 69 66 20 74 68 61 74 20 63 6c 61 73 68 65  t if that clashe
313b0 73 20 77 69 74 68 20 61 6e 6f 74 68 65 72 20 6e  s with another n
313c0 61 6d 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ame.    ** in th
313d0 65 20 72 65 63 6f 76 65 72 65 64 20 73 63 68 65  e recovered sche
313e0 6d 61 2c 20 74 72 79 20 7a 4c 6f 73 74 41 6e 64  ma, try zLostAnd
313f0 46 6f 75 6e 64 5f 30 2c 20 7a 4c 6f 73 74 41 6e  Found_0, zLostAn
31400 64 46 6f 75 6e 64 5f 31 0a 20 20 20 20 2a 2a 20  dFound_1.    ** 
31410 61 6e 64 20 73 6f 20 6f 6e 20 75 6e 74 69 6c 20  and so on until 
31420 61 20 6e 6f 6e 2d 63 6c 61 73 68 69 6e 67 20 6e  a non-clashing n
31430 61 6d 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 2a  ame is found.  *
31440 2f 0a 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d  /.    int iTab =
31450 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   0;.    char *zT
31460 61 62 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  ab = shellMPrint
31470 66 28 70 52 63 2c 20 22 25 73 22 2c 20 7a 4c 6f  f(pRc, "%s", zLo
31480 73 74 41 6e 64 46 6f 75 6e 64 29 3b 0a 20 20 20  stAndFound);.   
31490 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
314a0 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 68  Test = 0;.    sh
314b0 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
314c0 65 2d 3e 64 62 2c 20 70 52 63 2c 0a 20 20 20 20  e->db, pRc,.    
314d0 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52      "SELECT 1 FR
314e0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  OM recovery.sche
314f0 6d 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f 22  ma WHERE name=?"
31500 2c 20 26 70 54 65 73 74 0a 20 20 20 20 29 3b 0a  , &pTest.    );.
31510 20 20 20 20 69 66 28 20 70 54 65 73 74 20 29 20      if( pTest ) 
31520 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
31530 74 28 70 54 65 73 74 2c 20 31 2c 20 7a 54 61 62  t(pTest, 1, zTab
31540 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
31550 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 77 68 69  NSIENT);.    whi
31560 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  le( *pRc==SQLITE
31570 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
31580 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
31590 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pTest) ){.      
315a0 73 68 65 6c 6c 52 65 73 65 74 28 70 52 63 2c 20  shellReset(pRc, 
315b0 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pTest);.      sq
315c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29  lite3_free(zTab)
315d0 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 73  ;.      zTab = s
315e0 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
315f0 20 22 25 73 5f 25 64 22 2c 20 7a 4c 6f 73 74 41   "%s_%d", zLostA
31600 6e 64 46 6f 75 6e 64 2c 20 69 54 61 62 2b 2b 29  ndFound, iTab++)
31610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31620 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
31630 20 31 2c 20 7a 54 61 62 2c 20 2d 31 2c 20 53 51   1, zTab, -1, SQ
31640 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
31650 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
31660 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 54  Finalize(pRc, pT
31670 65 73 74 29 3b 0a 0a 20 20 20 20 70 54 61 62 20  est);..    pTab 
31680 3d 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a  = (RecoverTable*
31690 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63  )shellMalloc(pRc
316a0 2c 20 73 69 7a 65 6f 66 28 52 65 63 6f 76 65 72  , sizeof(Recover
316b0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
316c0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
316d0 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73  Tab->zQuoted = s
316e0 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
316f0 20 22 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20   "%Q", zTab);.  
31700 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
31710 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61   nCol;.      pTa
31720 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20  b->iPk = -2;.   
31730 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b     if( nCol>0 ){
31740 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
31750 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zlCol = (char**)
31760 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c  shellMalloc(pRc,
31770 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
31780 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20   (nCol+1));.    
31790 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 7a      if( pTab->az
317a0 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  lCol ){.        
317b0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e    pTab->azlCol[n
317c0 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69  Col] = shellMPri
317d0 6e 74 66 28 70 52 63 2c 20 22 22 29 3b 0a 20 20  ntf(pRc, "");.  
317e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 43          for(i=nC
317f0 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ol-1; i>=0; i--)
31800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  {.            pT
31810 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d 20  ab->azlCol[i] = 
31820 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63  shellMPrintf(pRc
31830 2c 20 22 25 73 2c 20 4e 55 4c 4c 22 2c 20 70 54  , "%s, NULL", pT
31840 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 2b 31 5d 29  ab->azlCol[i+1])
31850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31870 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 63 21  .      if( *pRc!
31880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31890 20 20 20 20 20 20 72 65 63 6f 76 65 72 46 72 65        recoverFre
318a0 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
318b0 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
318c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
318d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
318e0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
318f0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
31900 45 20 54 41 42 4c 45 20 25 73 28 72 6f 6f 74 70  E TABLE %s(rootp
31910 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 22 0a 20  gno INTEGER, ". 
31920 20 20 20 20 20 20 20 20 20 20 20 22 70 67 6e 6f             "pgno
31930 20 49 4e 54 45 47 45 52 2c 20 6e 66 69 65 6c 64   INTEGER, nfield
31940 20 49 4e 54 45 47 45 52 2c 20 69 64 20 49 4e 54   INTEGER, id INT
31950 45 47 45 52 22 2c 20 70 54 61 62 2d 3e 7a 51 75  EGER", pTab->zQu
31960 6f 74 65 64 0a 20 20 20 20 20 20 20 20 29 3b 0a  oted.        );.
31970 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
31980 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
31990 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
319a0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
319b0 20 22 2c 20 63 25 64 22 2c 20 69 29 3b 0a 20 20   ", c%d", i);.  
319c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
319d0 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
319e0 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b  e->out, ");\n");
319f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31a10 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zTab);.  }.  ret
31a20 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
31a30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31a40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
31a50 63 6f 76 65 72 20 64 61 74 61 20 66 72 6f 6d 20  cover data from 
31a60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 20  the database. A 
31a70 73 63 72 69 70 74 0a 2a 2a 20 74 6f 20 63 6f 6e  script.** to con
31a80 73 74 72 75 63 74 20 61 20 6e 65 77 20 64 61 74  struct a new dat
31a90 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
31aa0 20 61 6c 6c 20 72 65 63 6f 76 65 72 65 64 20 64   all recovered d
31ab0 61 74 61 20 69 73 20 6f 75 74 70 75 74 0a 2a 2a  ata is output.**
31ac0 20 6f 6e 20 73 74 72 65 61 6d 20 70 53 74 61 74   on stream pStat
31ad0 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  e->out..*/.stati
31ae0 63 20 69 6e 74 20 72 65 63 6f 76 65 72 44 61 74  c int recoverDat
31af0 61 62 61 73 65 43 6d 64 28 53 68 65 6c 6c 53 74  abaseCmd(ShellSt
31b00 61 74 65 20 2a 70 53 74 61 74 65 2c 20 69 6e 74  ate *pState, int
31b10 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
31b20 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
31b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
31b40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 6f 6f  lite3_stmt *pLoo
31b50 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
31b60 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
31b70 6c 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a  l root pages */.
31b80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
31b90 70 50 61 67 65 73 20 3d 20 30 3b 20 20 20 20 20  pPages = 0;     
31ba0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
31bb0 68 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 61  h all pages in a
31bc0 20 67 72 6f 75 70 20 2a 2f 0a 20 20 73 71 6c 69   group */.  sqli
31bd0 74 65 33 5f 73 74 6d 74 20 2a 70 43 65 6c 6c 73  te3_stmt *pCells
31be0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c   = 0;       /* L
31bf0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
31c00 63 65 6c 6c 73 20 69 6e 20 61 20 70 61 67 65 20  cells in a page 
31c10 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31c20 2a 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20 22  *zRecoveryDb = "
31c30 22 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ";   /* Name of 
31c40 22 72 65 63 6f 76 65 72 79 22 20 64 61 74 61 62  "recovery" datab
31c50 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
31c60 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75  har *zLostAndFou
31c70 6e 64 20 3d 20 22 6c 6f 73 74 5f 61 6e 64 5f 66  nd = "lost_and_f
31c80 6f 75 6e 64 22 3b 0a 20 20 69 6e 74 20 69 3b 0a  ound";.  int i;.
31c90 20 20 69 6e 74 20 6e 4f 72 70 68 61 6e 20 3d 20    int nOrphan = 
31ca0 2d 31 3b 0a 20 20 52 65 63 6f 76 65 72 54 61 62  -1;.  RecoverTab
31cb0 6c 65 20 2a 70 4f 72 70 68 61 6e 20 3d 20 30 3b  le *pOrphan = 0;
31cc0 0a 0a 20 20 69 6e 74 20 62 46 72 65 65 6c 69 73  ..  int bFreelis
31cd0 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  t = 1;          
31ce0 20 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d 66 72      /* 0 if --fr
31cf0 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 20 69  eelist-corrupt i
31d00 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
31d10 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
31d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
31d30 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
31d40 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
31d50 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
31d60 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
31d70 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
31d80 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31  z);.    if( n<=1
31d90 37 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 66 72  7 && memcmp("-fr
31da0 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 22 2c  eelist-corrupt",
31db0 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   z, n)==0 ){.   
31dc0 20 20 20 62 46 72 65 65 6c 69 73 74 20 3d 20 30     bFreelist = 0
31dd0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
31de0 69 66 28 20 6e 3c 3d 31 32 20 26 26 20 6d 65 6d  if( n<=12 && mem
31df0 63 6d 70 28 22 2d 72 65 63 6f 76 65 72 79 2d 64  cmp("-recovery-d
31e00 62 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20  b", z, n)==0 && 
31e10 69 3c 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  i<(nArg-1) ){.  
31e20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a      i++;.      z
31e30 52 65 63 6f 76 65 72 79 44 62 20 3d 20 61 7a 41  RecoveryDb = azA
31e40 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  rg[i];.    }else
31e50 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 35 20 26  .    if( n<=15 &
31e60 26 20 6d 65 6d 63 6d 70 28 22 2d 6c 6f 73 74 2d  & memcmp("-lost-
31e70 61 6e 64 2d 66 6f 75 6e 64 22 2c 20 7a 2c 20 6e  and-found", z, n
31e80 29 3d 3d 30 20 26 26 20 69 3c 28 6e 41 72 67 2d  )==0 && i<(nArg-
31e90 31 29 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  1) ){.      i++;
31ea0 0a 20 20 20 20 20 20 7a 4c 6f 73 74 41 6e 64 46  .      zLostAndF
31eb0 6f 75 6e 64 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  ound = azArg[i];
31ec0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
31ed0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31ee0 66 28 73 74 64 65 72 72 2c 20 22 75 6e 65 78 70  f(stderr, "unexp
31ef0 65 63 74 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  ected option: %s
31f00 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 20  \n", azArg[i]); 
31f10 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31f20 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f  f(stderr, "optio
31f30 6e 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 20  ns are:\n");.   
31f40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31f50 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 66 72 65  derr, "    --fre
31f60 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 5c 6e 22  elist-corrupt\n"
31f70 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
31f80 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
31f90 20 2d 2d 72 65 63 6f 76 65 72 79 2d 64 62 20 44   --recovery-db D
31fa0 41 54 41 42 41 53 45 5c 6e 22 29 3b 0a 20 20 20  ATABASE\n");.   
31fb0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31fc0 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 6c 6f 73  derr, "    --los
31fd0 74 2d 61 6e 64 2d 66 6f 75 6e 64 20 54 41 42 4c  t-and-found TABL
31fe0 45 2d 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  E-NAME\n");.    
31ff0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
32000 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 45 78  }.  }..  shellEx
32010 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
32020 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 2f 2a  >db, &rc,.    /*
32030 20 41 74 74 61 63 68 20 61 6e 20 69 6e 2d 6d 65   Attach an in-me
32040 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6e 61  mory database na
32050 6d 65 64 20 27 72 65 63 6f 76 65 72 79 27 2e 20  med 'recovery'. 
32060 43 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 65  Create an indexe
32070 64 20 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20  d .    ** cache 
32080 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 64 62  of the sqlite_db
32090 70 74 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ptr virtual tabl
320a0 65 2e 20 2a 2f 0a 20 20 20 20 22 41 54 54 41 43  e. */.    "ATTAC
320b0 48 20 25 51 20 41 53 20 72 65 63 6f 76 65 72 79  H %Q AS recovery
320c0 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  ;".    "DROP TAB
320d0 4c 45 20 49 46 20 45 58 49 53 54 53 20 72 65 63  LE IF EXISTS rec
320e0 6f 76 65 72 79 2e 64 62 70 74 72 3b 22 0a 20 20  overy.dbptr;".  
320f0 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46    "DROP TABLE IF
32100 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72 79   EXISTS recovery
32110 2e 66 72 65 65 6c 69 73 74 3b 22 0a 20 20 20 20  .freelist;".    
32120 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
32130 58 49 53 54 53 20 72 65 63 6f 76 65 72 79 2e 6d  XISTS recovery.m
32140 61 70 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  ap;".    "DROP T
32150 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 72  ABLE IF EXISTS r
32160 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 3b 22  ecovery.schema;"
32170 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
32180 4c 45 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65  LE recovery.free
32190 6c 69 73 74 28 70 67 6e 6f 20 49 4e 54 45 47 45  list(pgno INTEGE
321a0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 22  R PRIMARY KEY);"
321b0 2c 20 7a 52 65 63 6f 76 65 72 79 44 62 0a 20 20  , zRecoveryDb.  
321c0 29 3b 0a 0a 20 20 69 66 28 20 62 46 72 65 65 6c  );..  if( bFreel
321d0 69 73 74 20 29 7b 0a 20 20 20 20 73 68 65 6c 6c  ist ){.    shell
321e0 45 78 65 63 28 70 53 74 61 74 65 2d 3e 64 62 2c  Exec(pState->db,
321f0 20 26 72 63 2c 0a 20 20 20 20 20 20 22 57 49 54   &rc,.      "WIT
32200 48 20 74 72 75 6e 6b 28 70 67 6e 6f 29 20 41 53  H trunk(pgno) AS
32210 20 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c   (".      "  SEL
32220 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28  ECT shell_int32(
32230 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 28  ".      "      (
32240 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
32250 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57   sqlite_dbpage W
32260 48 45 52 45 20 70 67 6e 6f 3d 31 29 2c 20 38 29  HERE pgno=1), 8)
32270 20 41 53 20 78 20 22 0a 20 20 20 20 20 20 22 20   AS x ".      " 
32280 20 20 20 20 20 57 48 45 52 45 20 78 3e 30 22 0a       WHERE x>0".
32290 20 20 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e        "    UNION
322a0 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
322b0 54 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 22 0a  T shell_int32(".
322c0 20 20 20 20 20 20 22 20 20 20 20 20 20 28 53 45        "      (SE
322d0 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73  LECT data FROM s
322e0 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45  qlite_dbpage WHE
322f0 52 45 20 70 67 6e 6f 3d 74 72 75 6e 6b 2e 70 67  RE pgno=trunk.pg
32300 6e 6f 29 2c 20 30 29 20 41 53 20 78 20 22 0a 20  no), 0) AS x ". 
32310 20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f 4d       "      FROM
32320 20 74 72 75 6e 6b 20 57 48 45 52 45 20 78 3e 30   trunk WHERE x>0
32330 22 0a 20 20 20 20 20 20 22 29 2c 22 0a 20 20 20  ".      "),".   
32340 20 20 20 22 66 72 65 65 6c 69 73 74 28 64 61 74     "freelist(dat
32350 61 2c 20 6e 2c 20 66 72 65 65 70 67 6e 6f 29 20  a, n, freepgno) 
32360 41 53 20 28 22 0a 20 20 20 20 20 20 22 20 20 53  AS (".      "  S
32370 45 4c 45 43 54 20 64 61 74 61 2c 20 6d 69 6e 28  ELECT data, min(
32380 31 36 33 38 34 2c 20 73 68 65 6c 6c 5f 69 6e 74  16384, shell_int
32390 33 32 28 64 61 74 61 2c 20 31 29 2d 31 29 2c 20  32(data, 1)-1), 
323a0 74 2e 70 67 6e 6f 20 22 0a 20 20 20 20 20 20 22  t.pgno ".      "
323b0 20 20 20 20 20 20 46 52 4f 4d 20 74 72 75 6e 6b        FROM trunk
323c0 20 74 2c 20 73 71 6c 69 74 65 5f 64 62 70 61 67   t, sqlite_dbpag
323d0 65 20 73 20 57 48 45 52 45 20 73 2e 70 67 6e 6f  e s WHERE s.pgno
323e0 3d 74 2e 70 67 6e 6f 22 0a 20 20 20 20 20 20 22  =t.pgno".      "
323f0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20      UNION ALL". 
32400 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 64       "  SELECT d
32410 61 74 61 2c 20 6e 2d 31 2c 20 73 68 65 6c 6c 5f  ata, n-1, shell_
32420 69 6e 74 33 32 28 64 61 74 61 2c 20 32 2b 6e 29  int32(data, 2+n)
32430 20 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20   ".      "      
32440 46 52 4f 4d 20 66 72 65 65 6c 69 73 74 20 57 48  FROM freelist WH
32450 45 52 45 20 6e 3e 3d 30 22 0a 20 20 20 20 20 20  ERE n>=0".      
32460 22 29 22 0a 20 20 20 20 20 20 22 52 45 50 4c 41  ")".      "REPLA
32470 43 45 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79  CE INTO recovery
32480 2e 66 72 65 65 6c 69 73 74 20 53 45 4c 45 43 54  .freelist SELECT
32490 20 66 72 65 65 70 67 6e 6f 20 46 52 4f 4d 20 66   freepgno FROM f
324a0 72 65 65 6c 69 73 74 3b 22 0a 20 20 20 20 29 3b  reelist;".    );
324b0 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 45 78 65  .  }..  shellExe
324c0 63 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  c(pState->db, &r
324d0 63 2c 20 0a 20 20 20 20 22 43 52 45 41 54 45 20  c, .    "CREATE 
324e0 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 64  TABLE recovery.d
324f0 62 70 74 72 28 22 0a 20 20 20 20 22 20 20 20 20  bptr(".    "    
32500 20 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c 20 50    pgno, child, P
32510 52 49 4d 41 52 59 20 4b 45 59 28 63 68 69 6c 64  RIMARY KEY(child
32520 2c 20 70 67 6e 6f 29 22 0a 20 20 20 20 22 29 20  , pgno)".    ") 
32530 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a  WITHOUT ROWID;".
32540 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
32550 47 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63 6f 76  GNORE INTO recov
32560 65 72 79 2e 64 62 70 74 72 28 70 67 6e 6f 2c 20  ery.dbptr(pgno, 
32570 63 68 69 6c 64 29 20 22 0a 20 20 20 20 22 20 20  child) ".    "  
32580 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
32590 73 71 6c 69 74 65 5f 64 62 70 74 72 22 0a 20 20  sqlite_dbptr".  
325a0 20 20 22 20 20 20 20 20 20 57 48 45 52 45 20 70    "      WHERE p
325b0 67 6e 6f 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c  gno NOT IN freel
325c0 69 73 74 20 41 4e 44 20 63 68 69 6c 64 20 4e 4f  ist AND child NO
325d0 54 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a  T IN freelist;".
325e0 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  .    /* Delete a
325f0 6e 79 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61  ny pointer to pa
32600 67 65 20 31 2e 20 54 68 69 73 20 65 6e 73 75 72  ge 1. This ensur
32610 65 73 20 74 68 61 74 20 70 61 67 65 20 31 20 69  es that page 1 i
32620 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20  s considered.   
32630 20 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67 65 2c   ** a root page,
32640 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68   regardless of h
32650 6f 77 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ow corrupt the d
32660 62 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45  b is. */.    "DE
32670 4c 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65  LETE FROM recove
32680 72 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63  ry.dbptr WHERE c
32690 68 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20  hild = 1;"..    
326a0 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f  /* Delete all po
326b0 69 6e 74 65 72 73 20 74 6f 20 61 6e 79 20 70 61  inters to any pa
326c0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 6d 6f  ges that have mo
326d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e  re than one poin
326e0 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ter.    ** to th
326f0 65 6d 2e 20 53 75 63 68 20 70 61 67 65 73 20 77  em. Such pages w
32700 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61  ill be treated a
32710 73 20 72 6f 6f 74 20 70 61 67 65 73 20 77 68 65  s root pages whe
32720 6e 20 72 65 63 6f 76 65 72 69 6e 67 0a 20 20 20  n recovering.   
32730 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20   ** data.  */.  
32740 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72    "DELETE FROM r
32750 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48  ecovery.dbptr WH
32760 45 52 45 20 63 68 69 6c 64 20 49 4e 20 28 22 0a  ERE child IN (".
32770 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 63 68      "  SELECT ch
32780 69 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  ild FROM recover
32790 79 2e 64 62 70 74 72 20 47 52 4f 55 50 20 42 59  y.dbptr GROUP BY
327a0 20 63 68 69 6c 64 20 48 41 56 49 4e 47 20 63 6f   child HAVING co
327b0 75 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20 22 29  unt(*)>1".    ")
327c0 3b 22 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;"..    /* Creat
327d0 65 20 74 68 65 20 22 6d 61 70 22 20 74 61 62 6c  e the "map" tabl
327e0 65 20 74 68 61 74 20 77 69 6c 6c 20 28 65 76 65  e that will (eve
327f0 6e 74 75 61 6c 6c 79 29 20 63 6f 6e 74 61 69 6e  ntually) contain
32800 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
32810 20 20 2a 2a 20 66 6f 72 20 64 65 61 6c 69 6e 67    ** for dealing
32820 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
32830 69 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63  in the db that c
32840 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
32850 6f 72 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  ore .    ** reco
32860 72 64 73 2e 20 2a 2f 0a 20 20 20 20 22 43 52 45  rds. */.    "CRE
32870 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65  ATE TABLE recove
32880 72 79 2e 6d 61 70 28 22 0a 20 20 20 20 20 20 22  ry.map(".      "
32890 70 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  pgno INTEGER PRI
328a0 4d 41 52 59 20 4b 45 59 2c 20 6d 61 78 6c 65 6e  MARY KEY, maxlen
328b0 20 49 4e 54 2c 20 69 6e 74 6b 65 79 2c 20 72 6f   INT, intkey, ro
328c0 6f 74 20 49 4e 54 22 0a 20 20 20 20 22 29 3b 22  ot INT".    ");"
328d0 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
328e0 65 20 74 61 62 6c 65 20 5b 6d 61 70 5d 2e 20 49  e table [map]. I
328f0 66 20 74 68 65 72 65 20 61 72 65 20 63 69 72 63  f there are circ
32900 75 6c 61 72 20 6c 6f 6f 70 73 20 6f 66 20 70 61  ular loops of pa
32910 67 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ges in the.    *
32920 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
32930 66 6f 6c 6c 6f 77 69 6e 67 20 61 64 64 73 20 61  following adds a
32940 6c 6c 20 70 61 67 65 73 20 69 6e 20 73 75 63 68  ll pages in such
32950 20 61 20 6c 6f 6f 70 20 74 6f 20 74 68 65 20 6d   a loop to the m
32960 61 70 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64  ap.    ** as ind
32970 69 76 69 64 75 61 6c 20 72 6f 6f 74 20 70 61 67  ividual root pag
32980 65 73 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  es. This could b
32990 65 20 68 61 6e 64 6c 65 64 20 62 65 74 74 65 72  e handled better
329a0 2e 20 20 2a 2f 0a 20 20 20 20 22 57 49 54 48 20  .  */.    "WITH 
329b0 70 61 67 65 73 28 69 2c 20 6d 61 78 6c 65 6e 29  pages(i, maxlen)
329c0 20 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45   AS (".    "  SE
329d0 4c 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74 2c  LECT page_count,
329e0 20 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c   (".    "    SEL
329f0 45 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29  ECT max(field+1)
32a00 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64   FROM sqlite_dbd
32a10 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 70  ata WHERE pgno=p
32a20 61 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22  age_count".    "
32a30 20 20 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f    ) FROM pragma_
32a40 70 61 67 65 5f 63 6f 75 6e 74 20 57 48 45 52 45  page_count WHERE
32a50 20 70 61 67 65 5f 63 6f 75 6e 74 3e 30 22 0a 20   page_count>0". 
32a60 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c     "    UNION AL
32a70 4c 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  L".    "  SELECT
32a80 20 69 2d 31 2c 20 28 22 0a 20 20 20 20 22 20 20   i-1, (".    "  
32a90 20 20 53 45 4c 45 43 54 20 6d 61 78 28 66 69 65    SELECT max(fie
32aa0 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c 69 74  ld+1) FROM sqlit
32ab0 65 5f 64 62 64 61 74 61 20 57 48 45 52 45 20 70  e_dbdata WHERE p
32ac0 67 6e 6f 3d 69 2d 31 22 0a 20 20 20 20 22 20 20  gno=i-1".    "  
32ad0 29 20 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45  ) FROM pages WHE
32ae0 52 45 20 69 3e 3d 32 22 0a 20 20 20 20 22 29 22  RE i>=2".    ")"
32af0 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
32b00 4f 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 70  O recovery.map(p
32b10 67 6e 6f 2c 20 6d 61 78 6c 65 6e 2c 20 69 6e 74  gno, maxlen, int
32b20 6b 65 79 2c 20 72 6f 6f 74 29 20 22 0a 20 20 20  key, root) ".   
32b30 20 22 20 20 53 45 4c 45 43 54 20 69 2c 20 6d 61   "  SELECT i, ma
32b40 78 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 28 22 0a 20  xlen, NULL, (". 
32b50 20 20 20 22 20 20 20 20 57 49 54 48 20 70 28 6f     "    WITH p(o
32b60 72 69 67 2c 20 70 67 6e 6f 2c 20 70 61 72 65 6e  rig, pgno, paren
32b70 74 29 20 41 53 20 28 22 0a 20 20 20 20 22 20 20  t) AS (".    "  
32b80 20 20 20 20 53 45 4c 45 43 54 20 30 2c 20 69 2c      SELECT 0, i,
32b90 20 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52   (SELECT pgno FR
32ba0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74  OM recovery.dbpt
32bb0 72 20 57 48 45 52 45 20 63 68 69 6c 64 3d 69 29  r WHERE child=i)
32bc0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 55  ".    "        U
32bd0 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 22 20  NION ALL".    " 
32be0 20 20 20 20 20 53 45 4c 45 43 54 20 69 2c 20 70       SELECT i, p
32bf0 2e 70 61 72 65 6e 74 2c 20 22 0a 20 20 20 20 22  .parent, ".    "
32c00 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20          (SELECT 
32c10 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65  pgno FROM recove
32c20 72 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63  ry.dbptr WHERE c
32c30 68 69 6c 64 3d 70 2e 70 61 72 65 6e 74 29 20 46  hild=p.parent) F
32c40 52 4f 4d 20 70 22 0a 20 20 20 20 22 20 20 20 20  ROM p".    "    
32c50 29 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  )".    "    SELE
32c60 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 70 20 57  CT pgno FROM p W
32c70 48 45 52 45 20 28 70 61 72 65 6e 74 20 49 53 20  HERE (parent IS 
32c80 4e 55 4c 4c 20 4f 52 20 70 67 6e 6f 20 3d 20 6f  NULL OR pgno = o
32c90 72 69 67 29 22 0a 20 20 20 20 22 29 20 22 0a 20  rig)".    ") ". 
32ca0 20 20 20 22 46 52 4f 4d 20 70 61 67 65 73 20 57     "FROM pages W
32cb0 48 45 52 45 20 6d 61 78 6c 65 6e 20 3e 20 30 20  HERE maxlen > 0 
32cc0 41 4e 44 20 69 20 4e 4f 54 20 49 4e 20 66 72 65  AND i NOT IN fre
32cd0 65 6c 69 73 74 3b 22 0a 20 20 20 20 22 55 50 44  elist;".    "UPD
32ce0 41 54 45 20 72 65 63 6f 76 65 72 79 2e 6d 61 70  ATE recovery.map
32cf0 20 41 53 20 6f 20 53 45 54 20 69 6e 74 6b 65 79   AS o SET intkey
32d00 20 3d 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c   = (".    "  SEL
32d10 45 43 54 20 73 75 62 73 74 72 28 64 61 74 61 2c  ECT substr(data,
32d20 20 31 2c 20 31 29 3d 3d 58 27 30 44 27 20 46 52   1, 1)==X'0D' FR
32d30 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
32d40 20 57 48 45 52 45 20 70 67 6e 6f 3d 6f 2e 70 67   WHERE pgno=o.pg
32d50 6e 6f 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20  no".    ");"..  
32d60 20 20 2f 2a 20 45 78 74 72 61 63 74 20 64 61 74    /* Extract dat
32d70 61 20 66 72 6f 6d 20 70 61 67 65 20 31 20 61 6e  a from page 1 an
32d80 64 20 61 6e 79 20 6c 69 6e 6b 65 64 20 70 61 67  d any linked pag
32d90 65 73 20 69 6e 74 6f 20 74 61 62 6c 65 0a 20 20  es into table.  
32da0 20 20 2a 2a 20 72 65 63 6f 76 65 72 79 2e 73 63    ** recovery.sc
32db0 68 65 6d 61 2e 20 57 69 74 68 20 74 68 65 20 73  hema. With the s
32dc0 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 61 6e  ame schema as an
32dd0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
32de0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 22 43  able.  */.    "C
32df0 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f  REATE TABLE reco
32e00 76 65 72 79 2e 73 63 68 65 6d 61 28 74 79 70 65  very.schema(type
32e10 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65  , name, tbl_name
32e20 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 29  , rootpage, sql)
32e30 3b 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  ;".    "INSERT I
32e40 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 73 63 68  NTO recovery.sch
32e50 65 6d 61 20 53 45 4c 45 43 54 20 22 0a 20 20 20  ema SELECT ".   
32e60 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
32e70 4e 20 66 69 65 6c 64 3d 30 20 54 48 45 4e 20 76  N field=0 THEN v
32e80 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
32e90 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78  ND),".    "  max
32ea0 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64  (CASE WHEN field
32eb0 3d 31 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c  =1 THEN value EL
32ec0 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20  SE NULL END),". 
32ed0 20 20 20 22 20 20 6d 61 78 28 43 41 53 45 20 57     "  max(CASE W
32ee0 48 45 4e 20 66 69 65 6c 64 3d 32 20 54 48 45 4e  HEN field=2 THEN
32ef0 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c   value ELSE NULL
32f00 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d   END),".    "  m
32f10 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69 65  ax(CASE WHEN fie
32f20 6c 64 3d 33 20 54 48 45 4e 20 76 61 6c 75 65 20  ld=3 THEN value 
32f30 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22  ELSE NULL END),"
32f40 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45  .    "  max(CASE
32f50 20 57 48 45 4e 20 66 69 65 6c 64 3d 34 20 54 48   WHEN field=4 TH
32f60 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55  EN value ELSE NU
32f70 4c 4c 20 45 4e 44 29 22 0a 20 20 20 20 22 46 52  LL END)".    "FR
32f80 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61  OM sqlite_dbdata
32f90 20 57 48 45 52 45 20 70 67 6e 6f 20 49 4e 20 28   WHERE pgno IN (
32fa0 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
32fb0 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65  pgno FROM recove
32fc0 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72 6f 6f  ry.map WHERE roo
32fd0 74 3d 31 22 0a 20 20 20 20 22 29 22 0a 20 20 20  t=1".    ")".   
32fe0 20 22 47 52 4f 55 50 20 42 59 20 70 67 6e 6f 2c   "GROUP BY pgno,
32ff0 20 63 65 6c 6c 3b 22 0a 20 20 20 20 22 43 52 45   cell;".    "CRE
33000 41 54 45 20 49 4e 44 45 58 20 72 65 63 6f 76 65  ATE INDEX recove
33010 72 79 2e 73 63 68 65 6d 61 5f 72 6f 6f 74 70 61  ry.schema_rootpa
33020 67 65 20 4f 4e 20 73 63 68 65 6d 61 28 72 6f 6f  ge ON schema(roo
33030 74 70 61 67 65 29 3b 22 0a 20 20 29 3b 0a 0a 20  tpage);".  );.. 
33040 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e 73   /* Open a trans
33050 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 72 69  action, then pri
33060 6e 74 20 6f 75 74 20 61 6c 6c 20 6e 6f 6e 2d 76  nt out all non-v
33070 69 72 74 75 61 6c 2c 20 6e 6f 6e 2d 22 73 71 6c  irtual, non-"sql
33080 69 74 65 5f 25 22 20 0a 20 20 2a 2a 20 43 52 45  ite_%" .  ** CRE
33090 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
330a0 65 6e 74 73 20 74 68 61 74 20 65 78 74 72 61 63  ents that extrac
330b0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 78 69  ted from the exi
330c0 73 74 69 6e 67 20 73 63 68 65 6d 61 2e 20 20 2a  sting schema.  *
330d0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
330e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
330f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
33100 20 3d 20 30 3b 0a 20 20 20 20 72 61 77 5f 70 72   = 0;.    raw_pr
33110 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
33120 2c 20 22 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20  , "BEGIN;\n");. 
33130 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
33140 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tate->out, "PRAG
33150 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
33160 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20  ma = on;\n");.  
33170 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
33180 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
33190 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
331a0 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  sql FROM recover
331b0 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20 20  y.schema ".     
331c0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
331d0 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c  table' AND sql L
331e0 49 4b 45 20 27 63 72 65 61 74 65 20 74 61 62 6c  IKE 'create tabl
331f0 65 25 27 22 2c 20 26 70 53 74 6d 74 0a 20 20 20  e%'", &pStmt.   
33200 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72   );.    while( r
33210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33220 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
33230 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
33240 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
33250 68 61 72 20 2a 7a 43 72 65 61 74 65 54 61 62 6c  har *zCreateTabl
33260 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
33270 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33280 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
33290 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
332a0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43  (pState->out, "C
332b0 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
332c0 4f 54 20 45 58 49 53 54 53 20 25 73 3b 5c 6e 22  OT EXISTS %s;\n"
332d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 26 7a 43  , .          &zC
332e0 72 65 61 74 65 54 61 62 6c 65 5b 31 32 5d 0a 20  reateTable[12]. 
332f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
33300 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
33310 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
33320 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
33330 74 20 69 66 20 61 6e 20 6f 72 70 68 61 6e 20 74  t if an orphan t
33340 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 72 65 71  able will be req
33350 75 69 72 65 64 2e 20 41 6e 64 20 69 66 20 73 6f  uired. And if so
33360 2c 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20  , how many.  ** 
33370 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20 69 74 20  user columns it 
33380 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 2a  should contain *
33390 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  /.  shellPrepare
333a0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
333b0 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
333c0 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 6d 61   coalesce(max(ma
333d0 78 6c 65 6e 29 2c 20 2d 32 29 20 46 52 4f 4d 20  xlen), -2) FROM 
333e0 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45  recovery.map WHE
333f0 52 45 20 72 6f 6f 74 3e 31 22 0a 20 20 20 20 20  RE root>1".     
33400 20 2c 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20   , &pLoop.  );. 
33410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33420 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
33430 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
33440 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72  Loop) ){.    nOr
33450 70 68 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  phan = sqlite3_c
33460 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c  olumn_int(pLoop,
33470 20 30 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c   0);.  }.  shell
33480 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c  Finalize(&rc, pL
33490 6f 6f 70 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  oop);.  pLoop = 
334a0 30 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  0;..  shellPrepa
334b0 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
334c0 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  rc,.      "SELEC
334d0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f  T pgno FROM reco
334e0 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72  very.map WHERE r
334f0 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a  oot=?", &pPages.
33500 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70    );.  shellPrep
33510 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
33520 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  &rc,.      "SELE
33530 43 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20 67  CT max(field), g
33540 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c  roup_concat(shel
33550 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71 75  l_escape_crnl(qu
33560 6f 74 65 28 76 61 6c 75 65 29 29 2c 20 27 2c 20  ote(value)), ', 
33570 27 29 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20  ')".      "FROM 
33580 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48  sqlite_dbdata WH
33590 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20 41 4e 44  ERE pgno = ? AND
335a0 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a 20 20 20   field != ?".   
335b0 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 65 6c     "GROUP BY cel
335c0 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20 20 29 3b  l", &pCells.  );
335d0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
335e0 75 67 68 20 65 61 63 68 20 72 6f 6f 74 20 70 61  ugh each root pa
335f0 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72  ge. */.  shellPr
33600 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
33610 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22 53  , &rc, .      "S
33620 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69 6e 74 6b  ELECT root, intk
33630 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65 6e 29 20  ey, max(maxlen) 
33640 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61  FROM recovery.ma
33650 70 22 20 0a 20 20 20 20 20 20 22 20 57 48 45 52  p" .      " WHER
33660 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55 50 20 42  E root>1 GROUP B
33670 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65 79 20 4f  Y root, intkey O
33680 52 44 45 52 20 42 59 20 72 6f 6f 74 3d 28 22 0a  RDER BY root=(".
33690 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
336a0 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 72 65  rootpage FROM re
336b0 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48  covery.schema WH
336c0 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c 69 74 65  ERE name='sqlite
336d0 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
336e0 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70 0a 20 20    ")", &pLoop.  
336f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
33700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
33710 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
33720 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20 29 7b 0a  _step(pLoop) ){.
33730 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
33740 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
33750 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b 0a 20 20  nt(pLoop, 0);.  
33760 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 20 3d 20    int bIntkey = 
33770 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
33780 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b 0a 20 20  nt(pLoop, 1);.  
33790 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
337a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
337b0 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20 20 20 69  pLoop, 2);.    i
337c0 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20  nt bNoop = 0;.  
337d0 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a    RecoverTable *
337e0 70 54 61 62 3b 0a 0a 20 20 20 20 70 54 61 62 20  pTab;..    pTab 
337f0 3d 20 72 65 63 6f 76 65 72 46 69 6e 64 54 61 62  = recoverFindTab
33800 6c 65 28 70 53 74 61 74 65 2c 20 26 72 63 2c 20  le(pState, &rc, 
33810 69 52 6f 6f 74 2c 20 62 49 6e 74 6b 65 79 2c 20  iRoot, bIntkey, 
33820 6e 43 6f 6c 2c 20 26 62 4e 6f 6f 70 29 3b 0a 20  nCol, &bNoop);. 
33830 20 20 20 69 66 28 20 62 4e 6f 6f 70 20 7c 7c 20     if( bNoop || 
33840 72 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rc ) continue;. 
33850 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
33860 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 70  {.      if( pOrp
33870 68 61 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  han==0 ){.      
33880 20 20 70 4f 72 70 68 61 6e 20 3d 20 72 65 63 6f    pOrphan = reco
33890 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28 70  verOrphanTable(p
338a0 53 74 61 74 65 2c 20 26 72 63 2c 20 7a 4c 6f 73  State, &rc, zLos
338b0 74 41 6e 64 46 6f 75 6e 64 2c 20 6e 4f 72 70 68  tAndFound, nOrph
338c0 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  an);.      }.   
338d0 20 20 20 70 54 61 62 20 3d 20 70 4f 72 70 68 61     pTab = pOrpha
338e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  n;.      if( pTa
338f0 62 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  b==0 ) break;.  
33900 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
33910 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
33920 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 22  pTab->zQuoted, "
33930 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
33940 27 22 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '") ){.      raw
33950 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
33960 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  out, "DELETE FRO
33970 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
33980 65 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  e;\n");.    }.  
33990 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
339a0 6e 74 28 70 50 61 67 65 73 2c 20 31 2c 20 69 52  nt(pPages, 1, iR
339b0 6f 6f 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oot);.    sqlite
339c0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
339d0 73 2c 20 32 2c 20 70 54 61 62 2d 3e 69 50 6b 29  s, 2, pTab->iPk)
339e0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
339f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
33a00 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
33a10 65 33 5f 73 74 65 70 28 70 50 61 67 65 73 29 20  e3_step(pPages) 
33a20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  ){.      int iPg
33a30 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
33a40 75 6d 6e 5f 69 6e 74 28 70 50 61 67 65 73 2c 20  umn_int(pPages, 
33a50 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
33a60 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
33a70 73 2c 20 31 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  s, 1, iPgno);.  
33a80 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
33a90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
33aa0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
33ab0 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a  step(pCells) ){.
33ac0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65          int nFie
33ad0 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ld = sqlite3_col
33ae0 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  umn_int(pCells, 
33af0 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  0);.        cons
33b00 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28  t char *zVal = (
33b10 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
33b20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
33b30 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20 20 20  pCells, 1);..   
33b40 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 6e 46       nField = nF
33b50 69 65 6c 64 2b 31 3b 0a 20 20 20 20 20 20 20 20  ield+1;.        
33b60 69 66 28 20 70 54 61 62 3d 3d 70 4f 72 70 68 61  if( pTab==pOrpha
33b70 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
33b80 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
33b90 2d 3e 6f 75 74 2c 20 0a 20 20 20 20 20 20 20 20  ->out, .        
33ba0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
33bb0 54 4f 20 25 73 20 56 41 4c 55 45 53 28 25 64 2c  TO %s VALUES(%d,
33bc0 20 25 64 2c 20 25 64 2c 20 25 73 25 73 25 73 29   %d, %d, %s%s%s)
33bd0 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;\n",.          
33be0 20 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65      pTab->zQuote
33bf0 64 2c 20 69 52 6f 6f 74 2c 20 69 50 67 6e 6f 2c  d, iRoot, iPgno,
33c00 20 6e 46 69 65 6c 64 2c 20 0a 20 20 20 20 20 20   nField, .      
33c10 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79 20          bIntkey 
33c20 3f 20 22 22 20 3a 20 22 4e 55 4c 4c 2c 20 22 2c  ? "" : "NULL, ",
33c30 20 7a 56 61 6c 2c 20 70 54 61 62 2d 3e 61 7a 6c   zVal, pTab->azl
33c40 43 6f 6c 5b 6e 46 69 65 6c 64 5d 0a 20 20 20 20  Col[nField].    
33c50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
33c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33c70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
33c80 61 74 65 2d 3e 6f 75 74 2c 20 22 49 4e 53 45 52  ate->out, "INSER
33c90 54 20 49 4e 54 4f 20 25 73 28 25 73 29 20 56 41  T INTO %s(%s) VA
33ca0 4c 55 45 53 28 20 25 73 20 29 3b 5c 6e 22 2c 20  LUES( %s );\n", 
33cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
33cc0 54 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 70 54  Tab->zQuoted, pT
33cd0 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c  ab->azlCol[nFiel
33ce0 64 5d 2c 20 7a 56 61 6c 0a 20 20 20 20 20 20 20  d], zVal.       
33cf0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
33d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
33d10 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 43  ellReset(&rc, pC
33d20 65 6c 6c 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ells);.    }.   
33d30 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c   shellReset(&rc,
33d40 20 70 50 61 67 65 73 29 3b 0a 20 20 20 20 69 66   pPages);.    if
33d50 28 20 70 54 61 62 21 3d 70 4f 72 70 68 61 6e 20  ( pTab!=pOrphan 
33d60 29 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62  ) recoverFreeTab
33d70 6c 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  le(pTab);.  }.  
33d80 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
33d90 63 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 73 68 65  c, pLoop);.  she
33da0 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
33db0 70 50 61 67 65 73 29 3b 0a 20 20 73 68 65 6c 6c  pPages);.  shell
33dc0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 43  Finalize(&rc, pC
33dd0 65 6c 6c 73 29 3b 0a 20 20 72 65 63 6f 76 65 72  ells);.  recover
33de0 46 72 65 65 54 61 62 6c 65 28 70 4f 72 70 68 61  FreeTable(pOrpha
33df0 6e 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  n);..  /* The re
33e00 73 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  st of the schema
33e10 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
33e20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
33e30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
33e40 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c  mt = 0;.    shel
33e50 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
33e60 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20  >db, &rc, .     
33e70 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 2c 20     "SELECT sql, 
33e80 6e 61 6d 65 20 46 52 4f 4d 20 72 65 63 6f 76 65  name FROM recove
33e90 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20  ry.schema ".    
33ea0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
33eb0 4f 54 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20  OT LIKE 'create 
33ec0 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74  table%'", &pStmt
33ed0 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
33ee0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
33ef0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
33f00 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
33f10 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  mt) ){.      con
33f20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
33f30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
33f40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
33f50 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
33f60 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
33f70 72 6e 69 63 6d 70 28 7a 53 71 6c 2c 20 22 63 72  rnicmp(zSql, "cr
33f80 65 61 74 65 20 76 69 72 74 22 2c 20 31 31 29 3d  eate virt", 11)=
33f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
33fa0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
33fb0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
33fc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
33fd0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
33fe0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 69        char *zPri
33ff0 6e 74 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  nt = shellMPrint
34000 66 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  f(&rc, .        
34010 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
34020 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
34030 55 45 53 28 27 74 61 62 6c 65 27 2c 20 25 51 2c  UES('table', %Q,
34040 20 25 51 2c 20 30 2c 20 25 51 29 22 2c 0a 20 20   %Q, 0, %Q)",.  
34050 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
34060 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20 20 20 20 20  Name, zSql.     
34070 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 61     );.        ra
34080 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
34090 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  >out, "%s;\n", z
340a0 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  Print);.        
340b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
340c0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  int);.      }els
340d0 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
340e0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
340f0 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c  t, "%s;\n", zSql
34100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34110 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
34120 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
34130 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
34140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34150 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
34160 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  e->out, "PRAGMA 
34170 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
34180 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a 20 20 20 20  = off;\n");.    
34190 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
341a0 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b  e->out, "COMMIT;
341b0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  \n");.  }.  sqli
341c0 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d  te3_exec(pState-
341d0 3e 64 62 2c 20 22 44 45 54 41 43 48 20 72 65 63  >db, "DETACH rec
341e0 6f 76 65 72 79 22 2c 20 30 2c 20 30 2c 20 30 29  overy", 0, 0, 0)
341f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34200 0a 23 65 6e 64 69 66 20 2f 2a 20 21 28 53 51 4c  .#endif /* !(SQL
34210 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
34220 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
34230 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
34240 44 42 50 41 47 45 5f 56 54 41 42 29 20 2a 2f 0a  DBPAGE_VTAB) */.
34250 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ../*.** If an in
34260 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20  put line begins 
34270 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e  with "." then in
34280 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
34290 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20  e to.** process 
342a0 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
342b0 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
342c0 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
342d0 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
342e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
342f0 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68  _meta_command(ch
34300 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c  ar *zLine, Shell
34310 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
34320 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41   h = 1;.  int nA
34330 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  rg = 0;.  int n,
34340 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   c;.  int rc = 0
34350 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  ;.  char *azArg[
34360 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  50];..#ifndef SQ
34370 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
34380 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e  LTABLE.  if( p->
34390 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
343a0 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e 69  {.    expertFini
343b0 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  sh(p, 1, 0);.  }
343c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61  .#endif..  /* Pa
343d0 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69  rse the input li
343e0 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a  ne into tokens..
343f0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c    */.  while( zL
34400 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41  ine[h] && nArg<A
34410 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
34420 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  ){.    while( Is
34430 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
34440 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ h++; }.    if
34450 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20  ( zLine[h]==0 ) 
34460 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a  break;.    if( z
34470 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c  Line[h]=='\'' ||
34480 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29   zLine[h]=='"' )
34490 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69  {.      int deli
344a0 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a  m = zLine[h++];.
344b0 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
344c0 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
344d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
344e0 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[h] && zLine[
344f0 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]!=delim ){.   
34500 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
34510 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d  ]=='\\' && delim
34520 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68  =='"' && zLine[h
34530 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20  +1]!=0 ) h++;.  
34540 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20        h++;.     
34550 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
34560 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]==delim ){.
34570 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b          zLine[h+
34580 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  +] = 0;.      }.
34590 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d        if( delim=
345a0 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62  ='"' ) resolve_b
345b0 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
345c0 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
345d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72  else{.      azAr
345e0 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69  g[nArg++] = &zLi
345f0 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69  ne[h];.      whi
34600 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20  le( zLine[h] && 
34610 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68  !IsSpace(zLine[h
34620 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
34630 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20     if( zLine[h] 
34640 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30  ) zLine[h++] = 0
34650 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f  ;.      resolve_
34660 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
34670 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
34680 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
34690 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69  ess the input li
346a0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
346b0 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
346c0 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c  0; /* no tokens,
346d0 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e   no error */.  n
346e0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
346f0 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41  g[0]);.  c = azA
34700 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61  rg[0][0];.  clea
34710 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23  rTempFile(p);..#
34720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34730 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
34740 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
34750 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34760 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30  ], "auth", n)==0
34770 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
34780 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
34790 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
347a0 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e  "Usage: .auth ON
347b0 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |OFF\n");.      
347c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
347d0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
347e0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
347f0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
34800 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61     if( booleanVa
34810 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b  lue(azArg[1]) ){
34820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
34830 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
34840 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20  >db, shellAuth, 
34850 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
34860 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
34870 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64  _authorizer(p->d
34880 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  b, 0, 0);.    }.
34890 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
348a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
348b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
348c0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
348d0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
348e0 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  IB).  if( c=='a'
348f0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
34900 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22 2c  g[0], "archive",
34910 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
34920 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
34930 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61   rc = arDotComma
34940 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20  nd(p, 0, azArg, 
34950 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
34960 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d  endif..  if( (c=
34970 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
34980 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
34990 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d  , "backup", n)==
349a0 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27  0).   || (c=='s'
349b0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
349c0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
349d0 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  ave", n)==0).  )
349e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
349f0 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b   *zDestFile = 0;
34a00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
34a10 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71  *zDb = 0;.    sq
34a20 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
34a30 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
34a40 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
34a50 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 62 41  nt j;.    int bA
34a60 73 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 6f  sync = 0;.    co
34a70 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
34a80 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b   0;.    for(j=1;
34a90 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20   j<nArg; j++){. 
34aa0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34ab0 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  *z = azArg[j];. 
34ac0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
34ad0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  -' ){.        if
34ae0 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[1]=='-' ) z+
34af0 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  +;.        if( s
34b00 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e  trcmp(z, "-appen
34b10 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
34b20 20 20 20 20 7a 56 66 73 20 3d 20 22 61 70 6e 64      zVfs = "apnd
34b30 76 66 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  vfs";.        }e
34b40 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
34b50 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 73 79 6e  strcmp(z, "-asyn
34b60 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  c")==0 ){.      
34b70 20 20 20 20 62 41 73 79 6e 63 20 3d 20 31 3b 0a      bAsync = 1;.
34b80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
34b90 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
34ba0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
34bb0 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  derr, "unknown o
34bc0 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a  ption: %s\n", az
34bd0 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[j]);.       
34be0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
34bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
34c00 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65  se if( zDestFile
34c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
34c20 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
34c30 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
34c40 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20   if( zDb==0 ){. 
34c50 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65         zDb = zDe
34c60 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20  stFile;.        
34c70 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
34c80 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
34c90 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
34ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
34cb0 73 61 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f 44  sage: .backup ?D
34cc0 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49 4c  B? ?OPTIONS? FIL
34cd0 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
34ce0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
34cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
34d00 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
34d10 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
34d20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
34d30 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
34d40 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
34d50 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
34d60 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
34d70 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
34d80 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
34d90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
34da0 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c 20  n_v2(zDestFile, 
34db0 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20 20 20  &pDest, .       
34dc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
34dd0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
34de0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
34df0 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  ATE, zVfs);.    
34e00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34e10 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
34e20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34e30 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
34e40 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44  en \"%s\"\n", zD
34e50 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  estFile);.      
34e60 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
34e70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
34e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
34e90 41 73 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  Async ){.      s
34ea0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 65 73  qlite3_exec(pDes
34eb0 74 2c 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  t, "PRAGMA synch
34ec0 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20 50 52 41 47  ronous=OFF; PRAG
34ed0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
34ee0 4f 46 46 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  OFF;",.         
34ef0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
34f00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  0);.    }.    op
34f10 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
34f20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
34f30 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
34f40 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d  Dest, "main", p-
34f50 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  >db, zDb);.    i
34f60 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
34f70 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
34f80 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
34f90 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
34fa0 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29  3_errmsg(pDest))
34fb0 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62  ;.      close_db
34fc0 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
34fd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
34fe0 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
34ff0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
35000 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
35010 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
35020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
35030 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
35040 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
35050 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
35060 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
35070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35080 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35090 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
350a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
350b0 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
350c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
350d0 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73     close_db(pDes
350e0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
350f0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
35100 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
35110 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e  rg[0], "bail", n
35120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
35130 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
35140 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
35150 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
35160 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
35170 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
35180 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
35190 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66  age: .bail on|of
351a0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
351b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
351c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
351d0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
351e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
351f0 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b  inary", n)==0 ){
35200 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
35210 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f   ){.      if( bo
35220 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
35230 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [1]) ){.        
35240 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
35250 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
35260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
35270 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75  etTextMode(p->ou
35280 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
35290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
352a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
352b0 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61  r, "Usage: .bina
352c0 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ry on|off\n");. 
352d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
352e0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
352f0 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 63  ( c=='c' && strc
35300 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22  mp(azArg[0],"cd"
35310 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
35320 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64  nArg==2 ){.#if d
35330 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
35340 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
35350 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74 20 2a  .      wchar_t *
35360 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  z = sqlite3_win3
35370 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  2_utf8_to_unicod
35380 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
35390 20 20 20 72 63 20 3d 20 21 53 65 74 43 75 72 72     rc = !SetCurr
353a0 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 7a 29  entDirectoryW(z)
353b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
353c0 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20  free(z);.#else. 
353d0 20 20 20 20 20 72 63 20 3d 20 63 68 64 69 72 28       rc = chdir(
353e0 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69  azArg[1]);.#endi
353f0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
35400 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
35410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
35420 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20  annot change to 
35430 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22  directory \"%s\"
35440 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
35450 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
35460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35470 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
35480 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35490 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54 4f 52  ge: .cd DIRECTOR
354a0 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  Y\n");.      rc 
354b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
354c0 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64  se..  /* The und
354d0 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61  ocumented ".brea
354e0 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20  kpoint" command 
354f0 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f  causes a call to
35500 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20   the no-op.  ** 
35510 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65  routine named te
35520 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e  st_breakpoint().
35530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
35540 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
35550 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35560 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29  "breakpoint", n)
35570 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f  ==0 ){.    test_
35580 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
35590 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
355a0 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'c' && n>=3 && s
355b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
355c0 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d   "changes", n)==
355d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
355e0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65  g==2 ){.      se
355f0 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  tOrClearFlag(p, 
35600 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67  SHFLG_CountChang
35610 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  es, azArg[1]);. 
35620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35630 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
35640 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 61 6e  r, "Usage: .chan
35650 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ges on|off\n");.
35660 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35670 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
35680 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75 74 20  * Cancel output 
35690 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69 66 20  redirection, if 
356a0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
356b0 73 65 74 20 28 62 79 20 2e 74 65 73 74 63 61 73  set (by .testcas
356c0 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65 61  e).  ** Then rea
356d0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
356e0 20 74 68 65 20 74 65 73 74 63 61 73 65 2d 6f 75   the testcase-ou
356f0 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 20 63  t.txt file and c
35700 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 0a 20  ompare against. 
35710 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49   ** azArg[1].  I
35720 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
35730 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72 74 20  erences, report 
35740 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65 78 69  an error and exi
35750 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d  t..  */.  if( c=
35760 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='c' && n>=3 && 
35770 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
35780 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30  , "check", n)==0
35790 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52   ){.    char *zR
357a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70  es = 0;.    outp
357b0 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  ut_reset(p);.   
357c0 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
357d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
357e0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
357f0 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54   .check GLOB-PAT
35800 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  TERN\n");.      
35810 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  rc = 2;.    }els
35820 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20 72 65  e if( (zRes = re
35830 61 64 46 69 6c 65 28 22 74 65 73 74 63 61 73 65  adFile("testcase
35840 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d  -out.txt", 0))==
35850 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
35860 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35870 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61  rror: cannot rea
35880 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  d 'testcase-out.
35890 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20  txt'\n");.      
358a0 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  rc = 2;.    }els
358b0 65 20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67  e if( testcase_g
358c0 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65  lob(azArg[1],zRe
358d0 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  s)==0 ){.      u
358e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
358f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
35900 20 20 20 20 22 74 65 73 74 63 61 73 65 2d 25 73      "testcase-%s
35910 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65 63 74   FAILED\n Expect
35920 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20  ed: [%s]\n      
35930 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  Got: [%s]\n",.  
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
35950 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61 7a 41  ->zTestcase, azA
35960 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20  rg[1], zRes);.  
35970 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
35990 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  8_printf(stdout,
359a0 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 6f 6b   "testcase-%s ok
359b0 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73  \n", p->zTestcas
359c0 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68  e);.      p->nCh
359d0 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eck++;.    }.   
359e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
359f0 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  es);.  }else..  
35a00 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
35a10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35a20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29  "clone", n)==0 )
35a30 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
35a40 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f  2 ){.      tryTo
35a50 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31  Clone(p, azArg[1
35a60 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
35a70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35a80 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
35a90 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c  .clone FILENAME\
35aa0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
35ab0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
35ac0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
35ad0 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  & n>1 && strncmp
35ae0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61  (azArg[0], "data
35af0 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  bases", n)==0 ){
35b00 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20  .    ShellState 
35b10 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
35b20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
35b30 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
35b40 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
35b50 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
35b60 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
35b70 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
35b80 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
35b90 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
35ba0 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
35bb0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
35bc0 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  (data.colSeparat
35bd0 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61  or),data.colSepa
35be0 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20  rator,": ");.   
35bf0 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20   data.cnt = 0;. 
35c00 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
35c10 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
35c20 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70  ame, file FROM p
35c30 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c  ragma_database_l
35c40 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ist",.          
35c50 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
35c60 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
35c70 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
35c80 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
35c90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
35ca0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
35cb0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
35cc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
35cd0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
35ce0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
35cf0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
35d00 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
35d10 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63  p(azArg[0], "dbc
35d20 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b  onfig", n)==0 ){
35d30 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
35d40 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e 66 69  t struct DbConfi
35d50 67 43 68 6f 69 63 65 73 20 7b 0a 20 20 20 20 20  gChoices {.     
35d60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
35d70 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  me;.      int op
35d80 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f 6e 66 69  ;.    } aDbConfi
35d90 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  g[] = {.        
35da0 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c  { "enable_fkey",
35db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
35dc0 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45  ONFIG_ENABLE_FKE
35dd0 59 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  Y            },.
35de0 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c          { "enabl
35df0 65 5f 74 72 69 67 67 65 72 22 2c 20 20 20 53 51  e_trigger",   SQ
35e00 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
35e10 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20 20 20  ABLE_TRIGGER    
35e20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
35e30 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  { "fts3_tokenize
35e40 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43  r",   SQLITE_DBC
35e50 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53  ONFIG_ENABLE_FTS
35e60 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a  3_TOKENIZER  },.
35e70 20 20 20 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f          { "load_
35e80 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51  extension",   SQ
35e90 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
35ea0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
35eb0 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  ION  },.        
35ec0 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c  { "no_ckpt_on_cl
35ed0 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43  ose", SQLITE_DBC
35ee0 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e  ONFIG_NO_CKPT_ON
35ef0 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a  _CLOSE       },.
35f00 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c          { "enabl
35f10 65 5f 71 70 73 67 22 2c 20 20 20 20 20 20 53 51  e_qpsg",      SQ
35f20 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
35f30 41 42 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20  ABLE_QPSG       
35f40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
35f50 7b 20 22 74 72 69 67 67 65 72 5f 65 71 70 22 2c  { "trigger_eqp",
35f60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
35f70 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
35f80 50 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  P            },.
35f90 20 20 20 20 20 20 20 20 7b 20 22 72 65 73 65 74          { "reset
35fa0 5f 64 61 74 61 62 61 73 65 22 2c 20 20 20 53 51  _database",   SQ
35fb0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
35fc0 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20 20  SET_DATABASE    
35fd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
35fe0 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20 20  { "defensive",  
35ff0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
36000 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45 20  ONFIG_DEFENSIVE 
36010 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36020 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
36030 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  i, v;.    open_d
36040 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
36050 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79 53  (ii=0; ii<ArrayS
36060 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b 20  ize(aDbConfig); 
36070 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
36080 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63 6d   nArg>1 && strcm
36090 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43  p(azArg[1], aDbC
360a0 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29  onfig[ii].zName)
360b0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
360c0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d        if( nArg>=
360d0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
360e0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
360f0 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
36100 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56  ii].op, booleanV
36110 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20  alue(azArg[2]), 
36120 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
36130 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
36140 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f  fig(p->db, aDbCo
36150 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c  nfig[ii].op, -1,
36160 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66 38   &v);.      utf8
36170 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
36180 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44 62  "%18s %s\n", aDb
36190 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
361a0 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  , v ? "on" : "of
361b0 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  f");.      if( n
361c0 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  Arg>1 ) break;. 
361d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
361e0 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61 79  g>1 && ii==Array
361f0 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 20  Size(aDbConfig) 
36200 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
36210 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
36220 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63  ror: unknown dbc
36230 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c  onfig \"%s\"\n",
36240 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
36250 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36260 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e  derr, "Enter \".
36270 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68 20  dbconfig\" with 
36280 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
36290 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20   a list\n");.   
362a0 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20   }   .  }else.. 
362b0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
362c0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
362d0 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f  zArg[0], "dbinfo
362e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
362f0 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66  rc = shell_dbinf
36300 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72  o_command(p, nAr
36310 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
36320 73 65 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  se..#if !defined
36330 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
36340 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
36350 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
36360 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29  BLE_DBPAGE_VTAB)
36370 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
36380 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36390 5d 2c 20 22 72 65 63 6f 76 65 72 22 2c 20 6e 29  ], "recover", n)
363a0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
363b0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
363c0 20 3d 20 72 65 63 6f 76 65 72 44 61 74 61 62 61   = recoverDataba
363d0 73 65 43 6d 64 28 70 2c 20 6e 41 72 67 2c 20 61  seCmd(p, nArg, a
363e0 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  zArg);.  }else.#
363f0 65 6e 64 69 66 20 2f 2a 20 21 28 53 51 4c 49 54  endif /* !(SQLIT
36400 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
36410 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
36420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
36430 50 41 47 45 5f 56 54 41 42 29 20 2a 2f 0a 0a 20  PAGE_VTAB) */.. 
36440 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
36450 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
36460 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
36470 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
36480 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
36490 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
364a0 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
364b0 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
364c0 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
364d0 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
364e0 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
364f0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
36500 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
36510 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
36520 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
36530 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
36540 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
36550 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
36560 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
36570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
36580 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
36590 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
365a0 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
365b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
365c0 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
365d0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
365e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
365f0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
36600 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36610 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
36620 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
36630 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
36640 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
36650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36660 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
36670 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36680 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
36690 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
366a0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
366b0 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
366c0 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
366d0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
366e0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
366f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
36700 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
36710 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
36720 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
36730 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
36740 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
36750 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
36760 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
36770 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
36780 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
36790 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
367a0 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
367b0 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
367c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
367d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
367e0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
367f0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
36800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
36810 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
36820 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36830 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
36840 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
36850 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
36860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36870 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
36880 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
36890 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
368a0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
368b0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
368c0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
368d0 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
368e0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
368f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 70 65  }.    }..    ope
36900 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20 20 20  n_db(p, 0);..   
36910 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
36920 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
36930 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
36940 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
36950 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
36960 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
36970 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
36980 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
36990 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
369a0 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
369b0 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
369c0 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
369d0 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
369e0 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ems. */.    raw_
369f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36a00 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
36a10 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
36a20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
36a30 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
36a40 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
36a50 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
36a60 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ema = 0;.    p->
36a70 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
36a80 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61      /* Set writa
36a90 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69  ble_schema=ON si
36aa0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72  nce doing so for
36ab0 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e  ces SQLite to in
36ac0 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
36ad0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
36ae0 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20  chema as it can 
36af0 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69  even if the sqli
36b00 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
36b10 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  is.    ** corrup
36b20 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
36b30 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
36b40 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
36b50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
36b60 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
36b70 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
36b80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c   = 0;.    if( zL
36b90 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ike==0 ){.      
36ba0 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
36bb0 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
36bc0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
36bd0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
36be0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
36bf0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
36c00 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
36c10 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
36c20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
36c30 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
36c40 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
36c50 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
36c60 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
36c70 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
36c80 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
36c90 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
36ca0 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69  HERE name=='sqli
36cb0 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
36cc0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
36cd0 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
36ce0 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
36cf0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
36d00 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
36d10 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
36d20 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
36d30 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
36d40 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
36d50 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ", 0.      );.  
36d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
36d70 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
36d80 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
36d90 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
36da0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
36db0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
36dc0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
36dd0 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
36de0 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e  _name LIKE %Q AN
36df0 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
36e00 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
36e10 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  sql NOT NULL", z
36e20 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
36e30 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
36e40 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20  ry(p,zSql);.    
36e50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
36e60 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Sql);.      zSql
36e70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
36e80 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
36e90 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
36ea0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
36eb0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
36ec0 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
36ed0 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
36ee0 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
36ef0 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
36f00 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
36f10 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a  name LIKE %Q", z
36f20 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
36f30 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
36f40 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  y(p, zSql, 0);. 
36f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
36f60 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
36f70 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
36f80 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
36f90 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
36fa0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
36fb0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
36fc0 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
36fd0 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
36fe0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
36ff0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
37000 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
37010 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
37020 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
37030 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
37040 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70  b, "RELEASE dump
37050 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
37060 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
37070 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 3f 22 52 4f  out, p->nErr?"RO
37080 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
37090 6f 20 65 72 72 6f 72 73 5c 6e 22 3a 22 43 4f 4d  o errors\n":"COM
370a0 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  MIT;\n");.    p-
370b0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73 61  >showHeader = sa
370c0 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a 20  vedShowHeader;. 
370d0 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 20     p->shellFlgs 
370e0 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61 67  = savedShellFlag
370f0 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  s;.  }else..  if
37100 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
37110 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
37120 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  cho", n)==0 ){. 
37130 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
37140 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
37150 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
37160 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  Echo, azArg[1]);
37170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37180 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37190 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63  err, "Usage: .ec
371a0 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ho on|off\n");. 
371b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
371c0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
371d0 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
371e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
371f0 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  qp", n)==0 ){.  
37200 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
37210 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51  .      p->autoEQ
37220 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  Ptest = 0;.     
37230 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51 50 74   if( p->autoEQPt
37240 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
37250 69 66 28 20 70 2d 3e 64 62 20 29 20 73 71 6c 69  if( p->db ) sqli
37260 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
37270 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  "PRAGMA vdbe_tra
37280 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ce=OFF;", 0, 0, 
37290 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  0);.        p->a
372a0 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20 30 3b  utoEQPtrace = 0;
372b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
372c0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
372d0 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  1],"full")==0 ){
372e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
372f0 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75  EQP = AUTOEQP_fu
37300 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ll;.      }else 
37310 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
37320 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d  [1],"trigger")==
37330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
37340 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
37350 50 5f 74 72 69 67 67 65 72 3b 0a 23 69 66 64 65  P_trigger;.#ifde
37360 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37370 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
37380 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
37390 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
373a0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
373b0 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20  = AUTOEQP_on;.  
373c0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
373d0 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  test = 1;.      
373e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
373f0 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 61 63 65  (azArg[1],"trace
37400 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
37410 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
37420 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20  TOEQP_full;.    
37430 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 72      p->autoEQPtr
37440 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
37450 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
37460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
37470 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
37480 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
37490 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d 49  lite_master LIMI
374a0 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  T 1", 0, 0, 0);.
374b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
374c0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
374d0 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d 4f  GMA vdbe_trace=O
374e0 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  N;", 0, 0, 0);.#
374f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
37500 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  e{.        p->au
37510 74 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c  toEQP = (u8)bool
37520 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
37530 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
37540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
37550 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
37560 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66  "Usage: .eqp off
37570 7c 6f 6e 7c 74 72 61 63 65 7c 74 72 69 67 67 65  |on|trace|trigge
37580 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
37590 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
375a0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
375b0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
375c0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
375d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
375e0 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
375f0 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
37600 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
37610 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
37620 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
37630 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
37640 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
37650 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
37660 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
37670 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
37680 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
37690 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
376a0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
376b0 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
376c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
376d0 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
376e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
376f0 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
37700 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
37710 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
37720 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
37730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
37740 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
37750 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
37760 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
37770 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
37780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
37790 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
377a0 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
377b0 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
377c0 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
377d0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
377e0 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
377f0 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
37800 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
37810 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
37820 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
37830 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
37840 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
37850 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
37860 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
37870 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
37880 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
37890 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
378a0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
378b0 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
378c0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
378d0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
378e0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
378f0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
37900 51 4