/ Hex Artifact Content
Login

Artifact 2c49eff321d70abe720d5799f6abfb12c1093dda3956ac813060eb81a5cc8b05:


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 20 30 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 20  EN_NORMAL       
7a10: 31 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20  1     /* 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: 20 32 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 20 33 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 20 34 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 20 35 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 20 36  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 23  data source */.#
7ba0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7bb0: 4e 5f 53 48 41 52 45 44 53 43 48 45 4d 41 20 37  N_SHAREDSCHEMA 7
7bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 6f 72       /* Open for
7bd0: 20 73 63 68 65 6d 61 20 72 65 75 73 65 20 2a 2f   schema reuse */
7be0: 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  ../* Allowed val
7bf0: 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61  ues for ShellSta
7c00: 74 65 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f  te.eTraceType.*/
7c10: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54  .#define SHELL_T
7c20: 52 41 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20  RACE_PLAIN      
7c30: 30 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69  0      /* Show i
7c40: 6e 70 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f  nput SQL text */
7c50: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54  .#define SHELL_T
7c60: 52 41 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20  RACE_EXPANDED   
7c70: 31 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65  1      /* Show e
7c80: 78 70 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74  xpanded SQL text
7c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
7ca0: 4c 5f 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a  L_TRACE_NORMALIZ
7cb0: 45 44 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f  ED 2      /* Sho
7cc0: 77 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c  w normalized SQL
7cd0: 20 74 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74   text */../* Bit
7ce0: 73 20 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74  s in the ShellSt
7cf0: 61 74 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20  ate.flgProgress 
7d00: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66  variable */.#def
7d10: 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45  ine SHELL_PROGRE
7d20: 53 53 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f  SS_QUIET 0x01  /
7d30: 2a 20 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e  * Omit announcin
7d40: 67 20 65 76 65 72 79 20 70 72 6f 67 72 65 73 73  g every progress
7d50: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65   callback */.#de
7d60: 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52  fine SHELL_PROGR
7d70: 45 53 53 5f 52 45 53 45 54 20 30 78 30 32 20 20  ESS_RESET 0x02  
7d80: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63 6f 75  /* Reset the cou
7d90: 6e 74 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67  nt when the prog
7da0: 72 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  res.            
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 2a 2a 20 63 61 6c 6c 62 61         ** callba
7dd0: 63 6b 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63  ck limit is reac
7de0: 68 65 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63  hed, and for eac
7df0: 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65       ** top-leve
7e20: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
7e30: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7e40: 5f 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20  _PROGRESS_ONCE  
7e50: 30 78 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20  0x04  /* Cancel 
7e60: 74 68 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65  the --limit afte
7e70: 72 20 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f  r firing once */
7e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
7e90: 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68  e the allowed sh
7ea0: 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a  ellFlgs values.*
7eb0: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7ec0: 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30  Pagecache      0
7ed0: 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65  x00000001 /* The
7ee0: 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74   --pagecache opt
7ef0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
7f00: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f  define SHFLG_Loo
7f10: 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30  kaside      0x00
7f20: 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73  000002 /* Lookas
7f30: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  ide memory is us
7f40: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7f50: 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20  FLG_Backslash   
7f60: 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a     0x00000004 /*
7f70: 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68   The --backslash
7f80: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
7f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7fa0: 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20  _PreserveRowid  
7fb0: 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64  0x00000008 /* .d
7fc0: 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f  ump preserves ro
7fd0: 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64  wid values */.#d
7fe0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c  efine SHFLG_Newl
7ff0: 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30  ines       0x000
8000: 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d  00010 /* .dump -
8010: 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f  -newline flag */
8020: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43  .#define SHFLG_C
8030: 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78  ountChanges   0x
8040: 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61  00000020 /* .cha
8050: 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a  nges setting */.
8060: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63  #define SHFLG_Ec
8070: 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30  ho           0x0
8080: 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f  0000040 /* .echo
8090: 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69   or --echo setti
80a0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng */../*.** Mac
80b0: 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ros for testing 
80c0: 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c  and setting shel
80d0: 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  lFlgs.*/.#define
80e0: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c   ShellHasFlag(P,
80f0: 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65  X)    (((P)->she
8100: 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30  llFlgs & (X))!=0
8110: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53  ).#define ShellS
8120: 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  etFlag(P,X)    (
8130: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d  (P)->shellFlgs|=
8140: 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65  (X)).#define She
8150: 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29  llClearFlag(P,X)
8160: 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67    ((P)->shellFlg
8170: 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a  s&=(~(X)))../*.*
8180: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
8190: 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a  allowed modes..*
81a0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
81b0: 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e  ine     0  /* On
81c0: 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e  e column per lin
81d0: 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62  e.  Blank line b
81e0: 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a  etween records *
81f0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43  /.#define MODE_C
8200: 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e  olumn   1  /* On
8210: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
8220: 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e  e in neat column
8230: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
8240: 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a  E_List     2  /*
8250: 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20   One record per 
8260: 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61  line with a sepa
8270: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
8280: 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33   MODE_Semi     3
8290: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44    /* Same as MOD
82a0: 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e  E_List but appen
82b0: 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69  d ";" to each li
82c0: 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ne */.#define MO
82d0: 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f  DE_Html     4  /
82e0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48  * Generate an XH
82f0: 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  TML table */.#de
8300: 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74  fine MODE_Insert
8310: 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74     5  /* Generat
8320: 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73  e SQL "insert" s
8330: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65  tatements */.#de
8340: 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20  fine MODE_Quote 
8350: 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76     6  /* Quote v
8360: 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c  alues as for SQL
8370: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8380: 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20  _Tcl      7  /* 
8390: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
83a0: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
83b0: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
83c0: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
83d0: 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  8  /* Quote stri
83e0: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
83f0: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
8400: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
8410: 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  9  /* Like MODE_
8420: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
8430: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
8440: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8450: 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20  _Ascii   10  /* 
8460: 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61  Use ASCII unit a
8470: 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61  nd record separa
8480: 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29  tors (0x1F/0x1E)
8490: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
84a0: 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20  _Pretty  11  /* 
84b0: 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68  Pretty-print sch
84c0: 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  emas */.#define 
84d0: 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32 20  MODE_EQP     12 
84e0: 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50   /* Converts EXP
84f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
8500: 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72  output into a gr
8510: 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  aph */..static c
8520: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44  onst char *modeD
8530: 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69  escr[] = {.  "li
8540: 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c  ne",.  "column",
8550: 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65  .  "list",.  "se
8560: 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20  mi",.  "html",. 
8570: 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75   "insert",.  "qu
8580: 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20  ote",.  "tcl",. 
8590: 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61   "csv",.  "expla
85a0: 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a  in",.  "ascii",.
85b0: 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c    "prettyprint",
85c0: 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a  .  "eqp".};../*.
85d0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
85e0: 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65   column/row/line
85f0: 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64   separators used
8600: 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a   by the various.
8610: 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74  ** import/export
8620: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
8630: 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20  ne SEP_Column   
8640: 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   "|".#define SEP
8650: 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a  _Row       "\n".
8660: 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20  #define SEP_Tab 
8670: 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69        "\t".#defi
8680: 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20  ne SEP_Space    
8690: 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50   " ".#define SEP
86a0: 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23  _Comma     ",".#
86b0: 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20  define SEP_CrLf 
86c0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66       "\r\n".#def
86d0: 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20  ine SEP_Unit    
86e0: 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65    "\x1F".#define
86f0: 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22   SEP_Record    "
8700: 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  \x1E"../*.** A c
8710: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
8720: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e  sqlite3_log() in
8730: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
8740: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67  ic void shellLog
8750: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
8760: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
8770: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
8780: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
8790: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
87a0: 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  g;.  if( p->pLog
87b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
87c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70  utf8_printf(p->p
87d0: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
87e0: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
87f0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
8800: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Log);.}../*.** S
8810: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
8820: 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a  ell_putsnl(X).**
8830: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65  .** Write the te
8840: 78 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65  xt X to the scre
8850: 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20  en (or whatever 
8860: 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20  output is being 
8870: 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64  directed).** add
8880: 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74  ing a newline at
8890: 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68   the end, and th
88a0: 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a  en return X..*/.
88b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
88c0: 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c  lPutsFunc(.  sql
88d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
88e0: 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
88f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8900: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65  **apVal.){.  She
8910: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
8920: 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65  ellState*)sqlite
8930: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
8940: 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b  );.  (void)nVal;
8950: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
8960: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
8970: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8980: 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20  t(apVal[0]));.  
8990: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
89a0: 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c  alue(pCtx, apVal
89b0: 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  [0]);.}../*.** S
89c0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65  QL function:   e
89d0: 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20  dit(VALUE).**   
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
89f0: 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29  it(VALUE,EDITOR)
8a00: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65  .**.** These ste
8a10: 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ps:.**.**     (1
8a20: 29 20 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e  ) Write VALUE in
8a30: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  to a temporary f
8a40: 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ile..**     (2) 
8a50: 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54  Run program EDIT
8a60: 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  OR on that tempo
8a70: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  rary file..**   
8a80: 20 20 28 33 29 20 52 65 61 64 20 74 68 65 20 74    (3) Read the t
8a90: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61  emporary file ba
8aa0: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  ck and return it
8ab0: 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65  s content as the
8ac0: 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20   result..**     
8ad0: 28 34 29 20 44 65 6c 65 74 65 20 74 68 65 20 74  (4) Delete the t
8ae0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a  emporary file.**
8af0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f  .** If the EDITO
8b00: 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d  R argument is om
8b10: 69 74 74 65 64 2c 20 75 73 65 20 74 68 65 20 76  itted, use the v
8b20: 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53 55  alue in the VISU
8b30: 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e  AL.** environmen
8b40: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20  t variable.  If 
8b50: 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e  still there is n
8b60: 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67  o EDITOR, throug
8b70: 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  h an error..**.*
8b80: 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20  * Also throw an 
8b90: 65 72 72 6f 72 20 69 66 20 74 68 65 20 45 44 49  error if the EDI
8ba0: 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75  TOR program retu
8bb0: 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65  rns a non-zero e
8bc0: 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66  xit code..*/.#if
8bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
8be0: 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63  VE_SYSTEM.static
8bf0: 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a   void editFunc(.
8c00: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8c10: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8c20: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8c30: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8c40: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
8c50: 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20  zEditor;.  char 
8c60: 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  *zTempFile = 0;.
8c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8c80: 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b   char *zCmd = 0;
8c90: 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69  .  int bBin;.  i
8ca0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73  nt rc;.  int has
8cb0: 43 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45  CRNL = 0;.  FILE
8cc0: 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   *f = 0;.  sqlit
8cd0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73  e3_int64 sz;.  s
8ce0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
8cf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8d00: 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61  *p = 0;..  if( a
8d10: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45  rgc==2 ){.    zE
8d20: 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63  ditor = (const c
8d30: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
8d40: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
8d50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
8d60: 45 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28  Editor = getenv(
8d70: 22 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20  "VISUAL");.  }. 
8d80: 20 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20   if( zEditor==0 
8d90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8da0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8db0: 65 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20  ext, "no editor 
8dc0: 66 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29  for edit()", -1)
8dd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8de0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
8df0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
8e00: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
8e10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8e20: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8e30: 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75  text, "NULL inpu
8e40: 74 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31  t to edit()", -1
8e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8e60: 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65   }.  db = sqlite
8e70: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
8e80: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
8e90: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
8ea0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
8eb0: 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c  ntrol(db, 0, SQL
8ec0: 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
8ed0: 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69  LENAME, &zTempFi
8ee0: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70  le);.  if( zTemp
8ef0: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
8f00: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20  qlite3_uint64 r 
8f10: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8f20: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
8f30: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
8f40: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
8f50: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d  te3_mprintf("tem
8f60: 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20  p%llx", r);.    
8f70: 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30  if( zTempFile==0
8f80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
8fa0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
8fb0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8fc0: 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20   }.  }.  bBin = 
8fd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8fe0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
8ff0: 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57  ITE_BLOB;.  /* W
9000: 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
9010: 66 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65  file to be edite
9020: 64 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e  d, do \n to \r\n
9030: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20   conversions on 
9040: 73 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61  systems.  ** tha
9050: 74 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65  t want \r\n line
9060: 20 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20   endings */.  f 
9070: 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c  = fopen(zTempFil
9080: 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a  e, bBin ? "wb" :
9090: 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d   "w");.  if( f==
90a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
90b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
90c0: 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63  ntext, "edit() c
90d0: 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20  annot open temp 
90e0: 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  file", -1);.    
90f0: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
9100: 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73  nd;.  }.  sz = s
9110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
9120: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  es(argv[0]);.  i
9130: 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78  f( bBin ){.    x
9140: 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65   = fwrite(sqlite
9150: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
9160: 76 5b 30 5d 29 2c 20 31 2c 20 28 73 69 7a 65 5f  v[0]), 1, (size_
9170: 74 29 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73  t)sz, f);.  }els
9180: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
9190: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
91a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
91b0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
91c0: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
91d0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
91e0: 74 68 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e  the value origin
91f0: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c  ally contained \
9200: 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  r\n */.    if( z
9210: 20 26 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72   && strstr(z,"\r
9220: 5c 6e 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e  \n")!=0 ) hasCRN
9230: 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66  L = 1;.    x = f
9240: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
9250: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
9260: 29 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a  ), 1, (size_t)sz
9270: 2c 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  , f);.  }.  fclo
9280: 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a  se(f);.  f = 0;.
9290: 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20    if( x!=sz ){. 
92a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
92b0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
92c0: 20 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e   "edit() could n
92d0: 6f 74 20 77 72 69 74 65 20 74 68 65 20 77 68 6f  ot write the who
92e0: 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20  le file", -1);. 
92f0: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
9300: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d  c_end;.  }.  zCm
9310: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
9320: 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c  ntf("%s \"%s\"",
9330: 20 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46   zEditor, zTempF
9340: 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64  ile);.  if( zCmd
9350: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9360: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
9370: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
9380: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9390: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63  nc_end;.  }.  rc
93a0: 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b   = system(zCmd);
93b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
93c0: 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20  zCmd);.  if( rc 
93d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
93e0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
93f0: 65 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74  ext, "EDITOR ret
9400: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c  urned non-zero",
9410: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9420: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9430: 7d 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54  }.  f = fopen(zT
9440: 65 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  empFile, "rb");.
9450: 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20    if( f==0 ){.  
9460: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9470: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a  _error(context,.
9480: 20 20 20 20 20 20 22 65 64 69 74 28 29 20 63 61        "edit() ca
9490: 6e 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70  nnot reopen temp
94a0: 20 66 69 6c 65 20 61 66 74 65 72 20 65 64 69 74   file after edit
94b0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
94c0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
94d0: 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30    }.  fseek(f, 0
94e0: 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73  , SEEK_END);.  s
94f0: 7a 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20  z = ftell(f);.  
9500: 72 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d  rewind(f);.  p =
9510: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
9520: 34 28 20 73 7a 2b 31 20 29 3b 0a 20 20 69 66 28  4( sz+1 );.  if(
9530: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
9540: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9550: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
9560: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9570: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9580: 78 20 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20  x = fread(p, 1, 
9590: 28 73 69 7a 65 5f 74 29 73 7a 2c 20 66 29 3b 0a  (size_t)sz, f);.
95a0: 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66    fclose(f);.  f
95b0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73   = 0;.  if( x!=s
95c0: 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  z ){.    sqlite3
95d0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
95e0: 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f  ntext, "could no
95f0: 74 20 72 65 61 64 20 62 61 63 6b 20 74 68 65 20  t read back the 
9600: 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29  whole file", -1)
9610: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9620: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9630: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
9640: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
9650: 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  lob64(context, p
9660: 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72  , sz, sqlite3_fr
9670: 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ee);.  }else{.  
9680: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
9690: 69 2c 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61  i, j;.    if( ha
96a0: 73 43 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f  sCRNL ){.      /
96b0: 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
96c0: 6c 20 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20  l contains \r\n 
96d0: 74 68 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65  then do no conve
96e0: 72 73 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c  rsions back to \
96f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73  n */.      j = s
9700: 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  z;.    }else{.  
9710: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
9720: 6c 65 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  le did not origi
9730: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72  nally contain \r
9740: 5c 6e 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  \n then convert 
9750: 61 6e 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  any new.      **
9760: 20 5c 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20   \r\n back into 
9770: 5c 6e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  \n */.      for(
9780: 69 3d 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b  i=j=0; i<sz; i++
9790: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
97a0: 5b 69 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69  [i]=='\r' && p[i
97b0: 2b 31 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b  +1]=='\n' ) i++;
97c0: 0a 20 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20  .        p[j++] 
97d0: 3d 20 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = p[i];.      }.
97e0: 20 20 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20        sz = j;.  
97f0: 20 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20      p[sz] = 0;. 
9800: 20 20 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65     } .    sqlite
9810: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28  3_result_text64(
9820: 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20  context, (const 
9830: 63 68 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20  char*)p, sz,.   
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
9860: 72 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ree, SQLITE_UTF8
9870: 29 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a  );.  }.  p = 0;.
9880: 0a 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a  .edit_func_end:.
9890: 20 20 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65    if( f ) fclose
98a0: 28 66 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54  (f);.  unlink(zT
98b0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  empFile);.  sqli
98c0: 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69  te3_free(zTempFi
98d0: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
98e0: 72 65 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ree(p);.}.#endif
98f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56   /* SQLITE_NOHAV
9900: 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a  E_SYSTEM */../*.
9910: 2a 2a 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f  ** Save or resto
9920: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  re the current o
9930: 75 74 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74  utput mode.*/.st
9940: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9950: 4d 6f 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74  ModePush(ShellSt
9960: 61 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f  ate *p){.  p->mo
9970: 64 65 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64  dePrior = p->mod
9980: 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63  e;.  memcpy(p->c
9990: 6f 6c 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63  olSepPrior, p->c
99a0: 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a  olSeparator, siz
99b0: 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
99c0: 74 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28  tor));.  memcpy(
99d0: 70 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20  p->rowSepPrior, 
99e0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
99f0: 20 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65   sizeof(p->rowSe
9a00: 70 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61  parator));.}.sta
9a10: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d  tic void outputM
9a20: 6f 64 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74  odePop(ShellStat
9a30: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
9a40: 20 3d 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b   = p->modePrior;
9a50: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9a60: 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f  Separator, p->co
9a70: 6c 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f  lSepPrior, sizeo
9a80: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9a90: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9aa0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70  >rowSeparator, p
9ab0: 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73  ->rowSepPrior, s
9ac0: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
9ad0: 72 61 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rator));.}../*.*
9ae0: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
9af0: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68  en string as a h
9b00: 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20  ex-encoded blob 
9b10: 28 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a  (eg. X'1234' ).*
9b20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
9b30: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49  tput_hex_blob(FI
9b40: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76  LE *out, const v
9b50: 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20  oid *pBlob, int 
9b60: 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b  nBlob){.  int i;
9b70: 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  .  char *zBlob =
9b80: 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a   (char *)pBlob;.
9b90: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9ba0: 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d  ,"X'");.  for(i=
9bb0: 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29  0; i<nBlob; i++)
9bc0: 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74  { raw_printf(out
9bd0: 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d  ,"%02x",zBlob[i]
9be0: 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f  &0xff); }.  raw_
9bf0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b  printf(out,"'");
9c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
9c10: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
9c20: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65  not found anywhe
9c30: 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75  re in z[].  Retu
9c40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
9c50: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a  to that string..
9c60: 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65  **.** Try to use
9c70: 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74   zA and zB first
9c80: 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68  .  If both of th
9c90: 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ose are already 
9ca0: 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20  found in z[].** 
9cb0: 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d  then make up som
9cc0: 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f  e string and sto
9cd0: 72 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66  re it in the buf
9ce0: 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
9cf0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
9d00: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20  unused_string(. 
9d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73     /* Result mus
9d40: 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79  t not appear any
9d50: 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20  where in z */.  
9d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
9d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20  const char *zB, 
9d80: 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66    /* Try these f
9d90: 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  irst */.  char *
9da0: 7a 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  zBuf            
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9dc0: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
9dd0: 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67  generated string
9de0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
9df0: 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  d i = 0;.  if( s
9e00: 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20  trstr(z, zA)==0 
9e10: 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69  ) return zA;.  i
9e20: 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29  f( strstr(z, zB)
9e30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b  ==0 ) return zB;
9e40: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
9e50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a  e3_snprintf(20,z
9e60: 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41  Buf,"(%s%u)", zA
9e70: 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65  , i++);.  }while
9e80: 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29  ( strstr(z,zBuf)
9e90: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
9ea0: 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  zBuf;.}../*.** O
9eb0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
9ec0: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
9ed0: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
9ee0: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
9ef0: 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53  entions..**.** S
9f00: 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f  ee also: output_
9f10: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
9f20: 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69  tring().*/.stati
9f30: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
9f40: 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  oted_string(FILE
9f50: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
9f60: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
9f70: 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42    char c;.  setB
9f80: 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31  inaryMode(out, 1
9f90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
9fa0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
9fb0: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
9fc0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9fd0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9fe0: 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65  ,"'%s'",z);.  }e
9ff0: 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
a000: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a010: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
a020: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
a030: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
a040: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
a050: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
a060: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) i++;.      i
a070: 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20  f( i ){.        
a080: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
a090: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a   "%.*s", i, z);.
a0a0: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a          z += i;.
a0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a0c0: 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
a0d0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a0e0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20  out, "'");.     
a0f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
a110: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
a120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a130: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
a140: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a150: 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73  t, "'");.  }.  s
a160: 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20  etTextMode(out, 
a170: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  1);.}../*.** Out
a180: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
a190: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
a1a0: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
a1b0: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
a1c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69  tions..** Additi
a1d0: 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65  onallly , escape
a1e0: 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c   the "\n" and "\
a1f0: 72 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f  r" characters so
a200: 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f   that they do no
a210: 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74  t.** get corrupt
a220: 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e  ed by end-of-lin
a230: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61  e translation fa
a240: 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65  cilities in some
a250: 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
a260: 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
a270: 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74  s is like output
a280: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29  _quoted_string()
a290: 20 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64   but with the ad
a2a0: 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72  dition of the \r
a2b0: 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63  \n.** escape mec
a2c0: 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69  hanism..*/.stati
a2d0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
a2e0: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
a2f0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a310: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
a320: 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ;.  setBinaryMod
a330: 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72  e(out, 1);.  for
a340: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
a350: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26  !=0 && c!='\'' &
a360: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
a370: 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\r'; i++){}.  i
a380: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
a390: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
a3a0: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
a3b0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
a3c0: 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  r *zNL = 0;.    
a3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20  const char *zCR 
a3e0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c  = 0;.    int nNL
a3f0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
a400: 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  R = 0;.    char 
a410: 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32  zBuf1[20], zBuf2
a420: 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [20];.    for(i=
a430: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
a440: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
a450: 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20  \n' ) nNL++;.   
a460: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72     if( z[i]=='\r
a470: 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d  ' ) nCR++;.    }
a480: 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a  .    if( nNL ){.
a490: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a4a0: 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22  (out, "replace("
a4b0: 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75  );.      zNL = u
a4c0: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20  nused_string(z, 
a4d0: 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20  "\\n", "\\012", 
a4e0: 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20  zBuf1);.    }.  
a4f0: 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20    if( nCR ){.   
a500: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a510: 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a  t, "replace(");.
a520: 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73        zCR = unus
a530: 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c  ed_string(z, "\\
a540: 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75  r", "\\015", zBu
a550: 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  f2);.    }.    r
a560: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a570: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
a580: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
a590: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
a5a0: 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26  =0 && c!='\n' &&
a5b0: 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27   c!='\r' && c!='
a5c0: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
a5d0: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
a5e0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
a5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
a600: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
a610: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
a620: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
a630: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
a640: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
a650: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a660: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
a670: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
a680: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
a690: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
a6a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a6b0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  z++;.      if( c
a6c0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
a6d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6e0: 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20  , "%s", zNL);.  
a6f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
a710: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
a720: 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a  s", zCR);.    }.
a730: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a740: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66  ut, "'");.    if
a750: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
a760: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a770: 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22  ,'%s',char(13))"
a780: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a790: 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20    if( nNL ){.   
a7a0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a7b0: 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31  t, ",'%s',char(1
a7c0: 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  0))", zNL);.    
a7d0: 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d  }.  }.  setTextM
a7e0: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a  ode(out, 1);.}..
a7f0: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
a800: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
a810: 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64   a quoted accord
a820: 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20  ing to C or TCL 
a830: 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a  quoting rules..*
a840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
a850: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49  tput_c_string(FI
a860: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
a870: 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67  har *z){.  unsig
a880: 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75  ned int c;.  fpu
a890: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
a8a0: 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b  while( (c = *(z+
a8b0: 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  +))!=0 ){.    if
a8c0: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
a8d0: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a8e0: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  ;.      fputc(c,
a8f0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
a900: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
a910: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a920: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a930: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
a940: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a950: 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \t' ){.      fpu
a960: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
a970: 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20       fputc('t', 
a980: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a990: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
a9a0: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a9b0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a9c0: 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('n', out);.  
a9d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a9e0: 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \r' ){.      fpu
a9f0: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
aa00: 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20       fputc('r', 
aa10: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
aa20: 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30  if( !isprint(c&0
aa30: 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61  xff) ){.      ra
aa40: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c  w_printf(out, "\
aa50: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
aa60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aa70: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
aa80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
aa90: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
aaa0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
aab0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
aac0: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
aad0: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
aae0: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
aaf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
ab00: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
ab10: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
ab20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
ab30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
ab40: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
ab50: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
ab60: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
ab70: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ].            &&
ab80: 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20   z[i]!='<'.     
ab90: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
aba0: 27 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  '&'.            
abb0: 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20  && z[i]!='>'.   
abc0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
abd0: 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20  !='\"'.         
abe0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27     && z[i]!='\''
abf0: 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d  ;.        i++){}
ac00: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
ac10: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ac20: 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a  f(out,"%.*s",i,z
ac30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ac40: 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20   z[i]=='<' ){.  
ac50: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
ac60: 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20  ut,"&lt;");.    
ac70: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
ac80: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '&' ){.      raw
ac90: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d  _printf(out,"&am
aca0: 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  p;");.    }else 
acb0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b  if( z[i]=='>' ){
acc0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
acd0: 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20  f(out,"&gt;");. 
ace0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
acf0: 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20  ]=='\"' ){.     
ad00: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
ad10: 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d  "&quot;");.    }
ad20: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
ad30: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \'' ){.      raw
ad40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33  _printf(out,"&#3
ad50: 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  9;");.    }else{
ad60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ad70: 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b    }.    z += i +
ad80: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
ad90: 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74   If a field cont
ada0: 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74  ains any charact
adb0: 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
adc0: 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c   a 1 in the foll
add0: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20  owing.** array, 
ade0: 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20  then the string 
adf0: 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66  must be quoted f
ae00: 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69  or CSV..*/.stati
ae10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65  c const char nee
ae20: 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a  dCsvQuote[] = {.
ae30: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ae40: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
ae50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ae60: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
ae70: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
ae80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae90: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20  , 1, 1,.  1, 0, 
aea0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31  1, 0, 0, 0, 0, 1
aeb0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
aed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aee0: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
aef0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
af00: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af10: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
af20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af30: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
af40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
af50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af60: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
af70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af80: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
af90: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
afa0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
afb0: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
afc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a   0, 0, 0, 0, 1,.
afd0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
afe0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
aff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b000: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
b010: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
b020: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b030: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
b040: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b050: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
b070: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b080: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b090: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b0a0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0b0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
b0c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0d0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
b0e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
b0f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b100: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
b110: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b120: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b130: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
b140: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b150: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b160: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b170: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
b180: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   a single term o
b190: 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79  f CSV.  Actually
b1a0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
b1b0: 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  r is used for.**
b1c0: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20   the separator, 
b1d0: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
b1e0: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e   not be a comma.
b1f0: 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69    p->nullValue i
b200: 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61  s.** the null va
b210: 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72  lue.  Strings ar
b220: 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65  e quoted if nece
b230: 73 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61  ssary.  The sepa
b240: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79  rator.** is only
b250: 20 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20   issued if bSep 
b260: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
b270: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
b280: 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sv(ShellState *p
b290: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
b2a0: 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49   int bSep){.  FI
b2b0: 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74  LE *out = p->out
b2c0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
b2d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b2e0: 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c  out,"%s",p->null
b2f0: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
b300: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b310: 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65  int nSep = strle
b320: 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  n30(p->colSepara
b330: 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
b340: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
b350: 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76       if( needCsv
b360: 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64  Quote[((unsigned
b370: 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20   char*)z)[i]].  
b380: 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d         || (z[i]=
b390: 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  =p->colSeparator
b3a0: 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20  [0] &&.         
b3b0: 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20      (nSep==1 || 
b3c0: 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c  memcmp(z, p->col
b3d0: 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29  Separator, nSep)
b3e0: 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ==0)) ){.       
b3f0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   i = 0;.        
b400: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b410: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
b420: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
b430: 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74  *zQuoted = sqlit
b440: 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
b450: 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75  \"", z);.      u
b460: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
b470: 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a  "%s", zQuoted);.
b480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
b490: 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  ee(zQuoted);.   
b4a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
b4b0: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
b4c0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  %s", z);.    }. 
b4d0: 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b   }.  if( bSep ){
b4e0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
b4f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
b500: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
b510: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b520: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
b530: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72  when the user pr
b540: 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a  esses Ctrl-C.*/.
b550: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65  static void inte
b560: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e  rrupt_handler(in
b570: 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e  t NotUsed){.  UN
b580: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
b590: 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49  otUsed);.  seenI
b5a0: 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66  nterrupt++;.  if
b5b0: 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e  ( seenInterrupt>
b5c0: 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69  2 ) exit(1);.  i
b5d0: 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71  f( globalDb ) sq
b5e0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
b5f0: 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69  globalDb);.}..#i
b600: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
b610: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
b620: 4e 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65  N32)) && !define
b630: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a  d(_WIN32_WCE)./*
b640: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b650: 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c   runs for consol
b660: 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43  e events (e.g. C
b670: 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a  trl-C) on Win32.
b680: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57  */.static BOOL W
b690: 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72  INAPI ConsoleCtr
b6a0: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52  lHandler(.  DWOR
b6b0: 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20  D dwCtrlType /* 
b6c0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f  One of the CTRL_
b6d0: 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74  *_EVENT constant
b6e0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77  s */.){.  if( dw
b6f0: 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43  CtrlType==CTRL_C
b700: 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e  _EVENT ){.    in
b710: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
b720: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b730: 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RUE;.  }.  retur
b740: 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69  n FALSE;.}.#endi
b750: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
b760: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
b770: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  TION./*.** When 
b780: 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69  the ".auth ON" i
b790: 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  s set, the follo
b7a0: 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20  wing authorizer 
b7b0: 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69  callback is.** i
b7c0: 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61  nvoked.  It alwa
b7d0: 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
b7e0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
b7f0: 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20  int shellAuth(. 
b800: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
b810: 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  ta,.  int op,.  
b820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c  const char *zA1,
b830: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b840: 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  A2,.  const char
b850: 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA3,.  const c
b860: 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68  har *zA4.){.  Sh
b870: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
b880: 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65  hellState*)pClie
b890: 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63  ntData;.  static
b8a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
b8b0: 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20  ction[] = { 0,. 
b8c0: 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45      "CREATE_INDE
b8d0: 58 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45  X",         "CRE
b8e0: 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ATE_TABLE",     
b8f0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b900: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43  _INDEX",.     "C
b910: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
b920: 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45  ",    "CREATE_TE
b930: 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43  MP_TRIGGER",  "C
b940: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
b950: 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54  ,.     "CREATE_T
b960: 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22  RIGGER",       "
b970: 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20  CREATE_VIEW",   
b980: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c         "DELETE",
b990: 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45  .     "DROP_INDE
b9a0: 58 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44  X",           "D
b9b0: 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ROP_TABLE",     
b9c0: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
b9d0: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44  _INDEX",.     "D
b9e0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ROP_TEMP_TABLE",
b9f0: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
ba00: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44  _TRIGGER",    "D
ba10: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ROP_TEMP_VIEW",.
ba20: 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47       "DROP_TRIGG
ba30: 45 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52  ER",         "DR
ba40: 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  OP_VIEW",       
ba50: 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20       "INSERT",. 
ba60: 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20      "PRAGMA",   
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41              "REA
ba80: 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  D",             
ba90: 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20      "SELECT",.  
baa0: 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22     "TRANSACTION"
bab0: 2c 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41  ,          "UPDA
bac0: 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TE",            
bad0: 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20     "ATTACH",.   
bae0: 20 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20    "DETACH",     
baf0: 20 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52            "ALTER
bb00: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  _TABLE",        
bb10: 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20    "REINDEX",.   
bb20: 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20    "ANALYZE",    
bb30: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
bb40: 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20  E_VTABLE",      
bb50: 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c    "DROP_VTABLE",
bb60: 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22  .     "FUNCTION"
bb70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,             "S
bb80: 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20  AVEPOINT",      
bb90: 20 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45        "RECURSIVE
bba0: 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ".  };.  int i;.
bbb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
bbc0: 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a  [4];.  az[0] = z
bbd0: 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41  A1;.  az[1] = zA
bbe0: 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33  2;.  az[2] = zA3
bbf0: 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b  ;.  az[3] = zA4;
bc00: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
bc10: 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a  ->out, "authoriz
bc20: 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f  er: %s", azActio
bc30: 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  n[op]);.  for(i=
bc40: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<4; i++){.  
bc50: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
bc60: 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69  out, " ");.    i
bc70: 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  f( az[i] ){.    
bc80: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
bc90: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29  g(p->out, az[i])
bca0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bcb0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
bcc0: 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  >out, "NULL");. 
bcd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70     }.  }.  raw_p
bce0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
bcf0: 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
bd00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
bd10: 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  f../*.** Print a
bd20: 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e   schema statemen
bd30: 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45  t.  Part of MODE
bd40: 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50  _Semi and MODE_P
bd50: 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a  retty output..**
bd60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bd70: 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43   converts some C
bd80: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
bd90: 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f  ements for shado
bda0: 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46  w tables.** in F
bdb0: 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45  TS3/4/5 into CRE
bdc0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
bdd0: 20 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e   EXISTS statemen
bde0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
bdf0: 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  id printSchemaLi
be00: 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ne(FILE *out, co
be10: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e  nst char *z, con
be20: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b  st char *zTail){
be30: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
be40: 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 54 61 69  turn;.  if( zTai
be50: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
be60: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
be70: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
be80: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
be90: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
bea0: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
beb0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
bec0: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
bed0: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
bee0: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
bef0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
bf00: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
bf10: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
bf20: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
bf30: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
bf40: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
bf50: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
bf60: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
bf70: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
bf80: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
bf90: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
bfa0: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
bfb0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
bfc0: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
bfd0: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
bfe0: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
bff0: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
c000: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
c010: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
c020: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
c030: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
c040: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
c050: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
c060: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
c070: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
c080: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
c090: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c0a0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
c0b0: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
c0c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
c0d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
c0e0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
c0f0: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
c100: 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  to the EXPLAIN Q
c110: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
c120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c130: 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74  p_append(ShellSt
c140: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c150: 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  Id, int p2, cons
c160: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
c170: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c180: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74  New;.  int nText
c190: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78   = strlen30(zTex
c1a0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74  t);.  if( p->aut
c1b0: 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20  oEQPtest ){.    
c1c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c1d0: 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22  ut, "%d,%d,%s\n"
c1e0: 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54  , iEqpId, p2, zT
c1f0: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ext);.  }.  pNew
c200: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
c210: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
c220: 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20  w) + nText );.  
c230: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68  if( pNew==0 ) sh
c240: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
c250: 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71  y();.  pNew->iEq
c260: 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20  pId = iEqpId;.  
c270: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20  pNew->iParentId 
c280: 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70  = p2;.  memcpy(p
c290: 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78  New->zText, zTex
c2a0: 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70  t, nText+1);.  p
c2b0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
c2c0: 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e    if( p->sGraph.
c2d0: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pLast ){.    p->
c2e0: 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e  sGraph.pLast->pN
c2f0: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65  ext = pNew;.  }e
c300: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  lse{.    p->sGra
c310: 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a  ph.pRow = pNew;.
c320: 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e    }.  p->sGraph.
c330: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a  pLast = pNew;.}.
c340: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20  ./*.** Free and 
c350: 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49  reset the EXPLAI
c360: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
c370: 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  a that has been 
c380: 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20  collected.** in 
c390: 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74  p->sGraph..*/.st
c3a0: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65  atic void eqp_re
c3b0: 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
c3c0: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
c3d0: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
c3e0: 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d  .  for(pRow = p-
c3f0: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52  >sGraph.pRow; pR
c400: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
c410: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
c420: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
c430: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
c440: 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  w);.  }.  memset
c450: 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20  (&p->sGraph, 0, 
c460: 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68  sizeof(p->sGraph
c470: 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ));.}../* Return
c480: 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49   the next EXPLAI
c490: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e  N QUERY PLAN lin
c4a0: 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74 68  e with iEqpId th
c4b0: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
c4c0: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
c4d0: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
c4e0: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
c4f0: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
c500: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
c510: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
c520: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45  State *p, int iE
c530: 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f  qpId, EQPGraphRo
c540: 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47  w *pOld){.  EQPG
c550: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c560: 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65  pOld ? pOld->pNe
c570: 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70  xt : p->sGraph.p
c580: 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  Row;.  while( pR
c590: 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72  ow && pRow->iPar
c5a0: 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29 20  entId!=iEqpId ) 
c5b0: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c5c0: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f  xt;.  return pRo
c5d0: 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20  w;.}../* Render 
c5e0: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c5f0: 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74  f the graph that
c600: 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20 69   has iEqpId as i
c610: 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c  ts parent.  Call
c620: 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c  ed.** recursivel
c630: 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c  y to render subl
c640: 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  evels..*/.static
c650: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c660: 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74  _level(ShellStat
c670: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c680: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c690: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c6a0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c6b0: 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  30(p->sGraph.zPr
c6c0: 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a  efix);.  char *z
c6d0: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65  ;.  for(pRow = e
c6e0: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c6f0: 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b  EqpId, 0); pRow;
c700: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c710: 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f      pNext = eqp_
c720: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c730: 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a  Id, pRow);.    z
c740: 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a   = pRow->zText;.
c750: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c760: 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c  p->out, "%s%s%s\
c770: 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n", p->sGraph.zP
c780: 72 65 66 69 78 2c 0a 20 20 20 20 20 20 20 20 20  refix,.         
c790: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3f 20 22         pNext ? "
c7a0: 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29  |--" : "`--", z)
c7b0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  ;.    if( n<(int
c7c0: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70  )sizeof(p->sGrap
c7d0: 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a  h.zPrefix)-7 ){.
c7e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
c7f0: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c800: 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20  n], pNext ? "|  
c810: 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20  " : "   ", 4);. 
c820: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c830: 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69  level(p, pRow->i
c840: 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d  EqpId);.      p-
c850: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c860: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  n] = 0;.    }.  
c870: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  }.}../*.** Displ
c880: 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ay and reset the
c890: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c8a0: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
c8b0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64  ic void eqp_rend
c8c0: 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  er(ShellState *p
c8d0: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c8e0: 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61   *pRow = p->sGra
c8f0: 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70  ph.pRow;.  if( p
c900: 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Row ){.    if( p
c910: 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  Row->zText[0]=='
c920: 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
c930: 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  pRow->pNext==0 )
c940: 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72 65  {.        eqp_re
c950: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c960: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c970: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c980: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
c990: 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29  , pRow->zText+3)
c9a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70  ;.      p->sGrap
c9b0: 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70  h.pRow = pRow->p
c9c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
c9d0: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c9e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ca00: 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e  out, "QUERY PLAN
ca10: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
ca20: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
ca30: 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71  x[0] = 0;.    eq
ca40: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70  p_render_level(p
ca50: 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65  , 0);.    eqp_re
ca60: 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  set(p);.  }.}..#
ca70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ca80: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
ca90: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72  BACK./*.** Progr
caa0: 65 73 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ess handler call
cab0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
cac0: 69 6e 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e  int progress_han
cad0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65  dler(void *pClie
cae0: 6e 74 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c  ntData) {.  Shel
caf0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
cb00: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
cb10: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67  Data;.  p->nProg
cb20: 72 65 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  ress++;.  if( p-
cb30: 3e 6e 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d  >nProgress>=p->m
cb40: 78 50 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e  xProgress && p->
cb50: 6d 78 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a  mxProgress>0 ){.
cb60: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
cb70: 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73  ->out, "Progress
cb80: 20 6c 69 6d 69 74 20 72 65 61 63 68 65 64 20 28   limit reached (
cb90: 25 75 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67  %u)\n", p->nProg
cba0: 72 65 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  ress);.    if( p
cbb0: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cbc0: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52  SHELL_PROGRESS_R
cbd0: 45 53 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72  ESET ) p->nProgr
cbe0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ess = 0;.    if(
cbf0: 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20   p->flgProgress 
cc00: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cc10: 5f 4f 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f  _ONCE ) p->mxPro
cc20: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72  gress = 0;.    r
cc30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
cc40: 66 28 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65  f( (p->flgProgre
cc50: 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52  ss & SHELL_PROGR
cc60: 45 53 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b  ESS_QUIET)==0 ){
cc70: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
cc80: 70 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73  p->out, "Progres
cc90: 73 20 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f  s %u\n", p->nPro
cca0: 67 72 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65  gress);.  }.  re
ccb0: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
ccc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ccd0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
cce0: 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K */../*.** This
ccf0: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
cd00: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
cd10: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
cd20: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
cd30: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
cd40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
cd50: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
cd60: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
cd70: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
cd80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
cd90: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
cda0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
cdb0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
cdc0: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
cdd0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
cde0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
cdf0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
ce00: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
ce10: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
ce20: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
ce30: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
ce40: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
ce50: 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d  ;..  if( azArg==
ce60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ce70: 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65  switch( p->cMode
ce80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
ce90: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
cea0: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
ceb0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
cec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
ced0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
cee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
cef0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
cf00: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
cf10: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
cf20: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
cf30: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
cf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
cf50: 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  +>0 ) utf8_print
cf60: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
cf70: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
cf80: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cf90: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cfa0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
cfb0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
cfc0: 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s%s", w, azCol
cfd0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
cfe0: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
cff0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d000: 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53  llValue, p->rowS
d010: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
d020: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d030: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d040: 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20  ODE_Explain:.   
d050: 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   case MODE_Colum
d060: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  n: {.      stati
d070: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70  c const int aExp
d080: 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b  lainWidths[] = {
d090: 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20  4, 13, 4, 4, 4, 
d0a0: 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20  13, 2, 13};.    
d0b0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c    const int *col
d0c0: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  Width;.      int
d0d0: 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20   showHdr;.      
d0e0: 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20  char *rowSep;.  
d0f0: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
d100: 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b  ==MODE_Column ){
d110: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d120: 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b  h = p->colWidth;
d130: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
d140: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
d150: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
d160: 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
d170: 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
d180: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d190: 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74  h = aExplainWidt
d1a0: 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77  hs;.        show
d1b0: 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Hdr = 1;.       
d1c0: 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f   rowSep = SEP_Ro
d1d0: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
d1e0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d200: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d220: 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   w, n;.         
d230: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
d240: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b  (p->colWidth) ){
d250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d260: 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20   colWidth[i];.  
d270: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d280: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
d290: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30          if( w==0
d2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d2c0: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
d2d0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
d2e0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
d2f0: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
d300: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d310: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43       n = strlenC
d320: 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41  har(azArg && azA
d330: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
d340: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
d350: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d360: 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20  ( w<n ) w = n;. 
d370: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d380: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
d390: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
d3a0: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d3b0: 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64      p->actualWid
d3c0: 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20  th[i] = w;.     
d3d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d3e0: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d400: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
d410: 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  out, w, azCol[i]
d420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
d430: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d440: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
d450: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
d460: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
d470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d480: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
d490: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
d4a0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d4b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d4c0: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
d4d0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d4e0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d4f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d500: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
d510: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
d520: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
d530: 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20  0 ) w = -w;.    
d540: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
d560: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
d570: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d580: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d590: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
d5a0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
d5b0: 20 20 20 20 20 20 22 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 2d  ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
d600: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
d610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d640: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
d650: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
d660: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
d670: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
d680: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d690: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
d6a0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
d6b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d6c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d6d0: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
d6e0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d6f0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d710: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
d720: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
d730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d740: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d750: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
d760: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
d770: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
d780: 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28  ] && strlenChar(
d790: 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20  azArg[i])>w ){. 
d7a0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
d7b0: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
d7c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d7d0: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26       if( i==1 &&
d7e0: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20   p->aiIndent && 
d7f0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
d800: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e        if( p->iIn
d810: 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20  dent<p->nIndent 
d820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
d830: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d840: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
d850: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
d860: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
d870: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
d880: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
d890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
d8a0: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
d8b0: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67  p->out, w, azArg
d8c0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d8d0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d8e0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d8f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d900: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
d910: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
d920: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d930: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d940: 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20  e MODE_Semi: {  
d950: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
d960: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70  .fullschema outp
d970: 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e  ut */.      prin
d980: 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
d990: 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b  ut, azArg[0], ";
d9a0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
d9b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d9c0: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b  e MODE_Pretty: {
d9d0: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
d9e0: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74   .fullschema wit
d9f0: 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20  h --indent */.  
da00: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
da10: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
da20: 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a  int nParen = 0;.
da30: 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20        char cEnd 
da40: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
da50: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  c;.      int nLi
da60: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ne = 0;.      as
da70: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
da80: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
da90: 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [0]==0 ) break;.
daa0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
dab0: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
dac0: 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b  E VIEW%", azArg[
dad0: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
dae0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
daf0: 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47  ike("CREATE TRIG
db00: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
db10: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
db20: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
db30: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
db40: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
db50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
db60: 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71    }.      z = sq
db70: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
db80: 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  s", azArg[0]);. 
db90: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
dba0: 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61    for(i=0; IsSpa
dbb0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
dbc0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20  .      for(; (c 
dbd0: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
dbe0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
dbf0: 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
dc00: 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d        if( z[j-1]
dc10: 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20  =='\r' ) z[j-1] 
dc20: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
dc30: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
dc40: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
dc50: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
dc60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dc70: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
dc80: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
dc90: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
dca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
dcb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dcc0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
dce0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
dcf0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
dd00: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
dd10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
dd20: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
dd30: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
dd40: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
dd50: 21 3d 30 3b 20 69 2b 2b 29 7b 20 2f 2a 20 43 6f  !=0; i++){ /* Co
dd60: 70 79 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63  py from z[i] bac
dd70: 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20  k to z[j] */.   
dd80: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45         if( c==cE
dd90: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
dda0: 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20    cEnd = 0;.    
ddb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddc0: 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27  c=='"' || c=='\'
ddd0: 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20  ' || c=='`' ){. 
dde0: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
ddf0: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = c;.          }
de00: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
de10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
de20: 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20  End = ']';.     
de30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
de40: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
de50: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
de60: 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b      cEnd = '\n';
de70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
de80: 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20   if( c=='(' ){. 
de90: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
dea0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
deb0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20  else if( c==')' 
dec0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
ded0: 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  Paren--;.       
dee0: 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30       if( nLine>0
def0: 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26   && nParen==0 &&
df00: 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j>0 ){.        
df10: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
df20: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
df30: 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  , j, "\n");.    
df40: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
df50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
df60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
df70: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b       z[j++] = c;
df80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
df90: 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64  Paren==1 && cEnd
dfa0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
dfb0: 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d  & (c=='(' || c==
dfc0: 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20  '\n' || (c==',' 
dfd0: 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b  && !wsToEol(z+i+
dfe0: 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  1))).          )
dff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
e000: 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b  ( c=='\n' ) j--;
e010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
e020: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
e030: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20  >out, z, j, "\n 
e040: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
e050: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
e060: 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20      nLine++;.   
e070: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
e080: 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20  IsSpace(z[i+1]) 
e090: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
e0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e0b0: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
e0c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e0d0: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
e0e0: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22  p->out, z, ";\n"
e0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e100: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
e110: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e120: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a   case MODE_List:
e130: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e140: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e150: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e160: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e170: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e180: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e190: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
e1a0: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e              i==n
e1c0: 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65  Arg-1 ? p->rowSe
e1d0: 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c  parator : p->col
e1e0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e1f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e200: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
e210: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e220: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e230: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
e240: 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
e250: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
e260: 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c  ==0 ) z = p->nul
e270: 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lValue;.        
e280: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e290: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
e2a0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67        if( i<nArg
e2b0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
e2c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e2d0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
e2e0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e2f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e300: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e310: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e320: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e330: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e340: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e350: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e360: 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20  ODE_Html: {.    
e370: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e380: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e390: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  er ){.        ra
e3a0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e3b0: 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TR>");.       
e3c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e3d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e3e0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e3f0: 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20  out,"<TH>");.   
e400: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
e410: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
e420: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
e430: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e440: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c  f(p->out,"</TH>\
e450: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
e460: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e470: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
e480: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
e490: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e4a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
e4b0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e4c0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
e4d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e4e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
e4f0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e500: 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TD>");.      
e510: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
e520: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
e530: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
e540: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
e550: 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
e560: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
e570: 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  D>\n");.      }.
e580: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e590: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
e5a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
e5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e5c0: 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20  MODE_Tcl: {.    
e5d0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e5e0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e5f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e600: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e610: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
e620: 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
e630: 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f  ->out,azCol[i] ?
e640: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
e650: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 69 3c  .          if(i<
e660: 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69  nArg-1) utf8_pri
e670: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e680: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
e690: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e6a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e6b0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e6c0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e6d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6e0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
e6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
e700: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e710: 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  ){.        outpu
e720: 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
e730: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
e740: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
e750: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e760: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
e770: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e780: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
e790: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e7a0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
e7b0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e7c0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e7d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e7e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e7f0: 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20  ODE_Csv: {.     
e800: 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70   setBinaryMode(p
e810: 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
e820: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e830: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e840: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
e850: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e860: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
e870: 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f  tput_csv(p, azCo
e880: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
e890: 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b  : "", i<nArg-1);
e8a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e8b0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e8c0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e8d0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
e8e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e8f0: 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20   nArg>0 ){.     
e900: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e910: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e920: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
e930: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41  , azArg[i], i<nA
e940: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
e950: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e960: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e970: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e980: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
e990: 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
e9a0: 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
e9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e9c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65    case MODE_Inse
e9d0: 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  rt: {.      if( 
e9e0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e9f0: 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
ea00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45  ntf(p->out,"INSE
ea10: 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a  RT INTO %s",p->z
ea20: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
ea30: 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61    if( p->showHea
ea40: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  der ){.        r
ea50: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ea60: 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66  ,"(");.        f
ea70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ea80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
ea90: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
eaa0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
eab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
eac0: 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c   quoteChar(azCol
ead0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
eae0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
eaf0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
eb00: 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d  "%w\"", azCol[i]
eb10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
eb20: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
eb30: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
eb40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eb50: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
eb60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb70: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
eb80: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
eb90: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
eba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ebb0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
ebc0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b  ntf(p->out,")");
ebd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ebe0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66  ->cnt++;.      f
ebf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ec00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61  i++){.        ra
ec10: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ec20: 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56   i>0 ? "," : " V
ec30: 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20  ALUES(");.      
ec40: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
ec50: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
ec60: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
ec70: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
ec80: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ec90: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
eca0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ecb0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
ecc0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
ecd0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
ece0: 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46     if( ShellHasF
ecf0: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
ed00: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
ed10: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
ed20: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
ed30: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
ed40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ed50: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
ed60: 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64  t_quoted_escaped
ed70: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
ed80: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
ed90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
eda0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
edb0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
edc0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
edd0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
ede0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
edf0: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
ee00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ee10: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ee20: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
ee30: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
ee40: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
ee50: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
ee60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
ee70: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
ee80: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
ee90: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72 3b  lite3_uint64 ur;
eea0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
eeb0: 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66 28  y(&ur,&r,sizeof(
eec0: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  r));.          i
eed0: 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30 30  f( ur==0x7ff0000
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 31  rintf(p->out, "1
ef10: 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20  e999");.        
ef20: 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d 3d    }else if( ur==
ef30: 30 78 66 66 66 30 30 30 30 30 30 30 30 30 30 30  0xfff00000000000
ef40: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
ef50: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ef60: 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22 29  ->out, "-1e999")
ef70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ef80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ef90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
efa0: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
efb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
efc0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
efd0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
efe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eff0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
f000: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f010: 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d  QLITE_BLOB && p-
f020: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
f030: 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
f040: 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
f050: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70  column_blob(p->p
f060: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f070: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20      int nBlob = 
f080: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f090: 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69  ytes(p->pStmt, i
f0a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
f0b0: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e  put_hex_blob(p->
f0c0: 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  out, pBlob, nBlo
f0d0: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
f0e0: 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61  e if( isNumber(a
f0f0: 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20  zArg[i], 0) ){. 
f100: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
f110: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f120: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f130: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
f140: 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
f150: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29  HFLG_Newlines) )
f160: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
f170: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
f180: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f190: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f1a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
f1b0: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
f1c0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f1d0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f1e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f1f0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f200: 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a  p->out,");\n");.
f210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f220: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f230: 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20  _Quote: {.      
f240: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
f250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
f260: 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e  p->cnt==0 && p->
f270: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
f280: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f290: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f2a0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f2b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f2c0: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
f2d0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f2e0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
f2f0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
f300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
f310: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f320: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
f330: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
f340: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f350: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f360: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61      if( i>0 ) ra
f370: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f380: 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69   ",");.        i
f390: 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29  f( (azArg[i]==0)
f3a0: 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61   || (aiType && a
f3b0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f3c0: 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
f3d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f3e0: 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a  p->out,"NULL");.
f3f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f400: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f410: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45  pe[i]==SQLITE_TE
f420: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
f430: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
f440: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
f450: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f460: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
f470: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f480: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
f490: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f4a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f4b0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
f4c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f4d0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f4e0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
f4f0: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
f500: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
f510: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
f520: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f530: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
f540: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
f550: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f560: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
f570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
f580: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f590: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
f5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
f5b0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f5c0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
f5d0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
f5e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
f5f0: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
f600: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
f610: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f620: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
f630: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f640: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
f650: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
f660: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
f670: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
f680: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
f690: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
f6a0: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
f6b0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f6c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f6d0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
f6e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f6f0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
f700: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
f710: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
f720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f730: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
f740: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
f750: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f760: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
f770: 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20  E_Ascii: {.     
f780: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
f790: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f7a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f7b0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f7c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f7d0: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
f7e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f7f0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
f800: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  r);.          ut
f810: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f820: 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f  ,"%s",azCol[i] ?
f830: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
f840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f850: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f860: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f870: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
f880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f890: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
f8a0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
f8b0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f8c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
f8d0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
f8e0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
f8f0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
f900: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f910: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
f920: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
f930: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
f940: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f950: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f960: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
f970: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
f980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f990: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 51      case MODE_EQ
f9a0: 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f 61  P: {.      eqp_a
f9b0: 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61 7a  ppend(p, atoi(az
f9c0: 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61 7a  Arg[0]), atoi(az
f9d0: 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b 33  Arg[1]), azArg[3
f9e0: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
f9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fa00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fa10: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
fa20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61  back routine tha
fa30: 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  t the SQLite lib
fa40: 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  rary.** invokes 
fa50: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
fa60: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
fa70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
fa80: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
fa90: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
faa0: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
fab0: 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73  **azCol){.  /* s
fac0: 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61  ince we don't ha
fad0: 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61  ve type info, ca
fae0: 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c  ll the shell_cal
faf0: 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c  lback with a NUL
fb00: 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74  L value */.  ret
fb10: 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  urn shell_callba
fb20: 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61  ck(pArg, nArg, a
fb30: 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c  zArg, azCol, NUL
fb40: 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  L);.}../*.** Thi
fb50: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
fb60: 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73  k routine from s
fb70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68  qlite3_exec() th
fb80: 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a  at appends all.*
fb90: 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68  * output onto th
fba0: 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c  e end of a Shell
fbb0: 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Text object..*/.
fbc0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75  static int captu
fbd0: 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b  reOutputCallback
fbe0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
fbf0: 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
fc00: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b  Arg, char **az){
fc10: 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20  .  ShellText *p 
fc20: 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41  = (ShellText*)pA
fc30: 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55  rg;.  int i;.  U
fc40: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
fc50: 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67  az);.  if( azArg
fc60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fc70: 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70    if( p->n ) app
fc80: 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20  endText(p, "|", 
fc90: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
fca0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
fcb0: 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54   if( i ) appendT
fcc0: 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a  ext(p, ",", 0);.
fcd0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
fce0: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
fcf0: 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20   azArg[i], 0);. 
fd00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
fd10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
fd20: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
fd30: 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69  SELFTEST table i
fd40: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
fd50: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
fd60: 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65  oid createSelfte
fd70: 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61  stTable(ShellSta
fd80: 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  te *p){.  char *
fd90: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
fda0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
fdb0: 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e  b,.    "SAVEPOIN
fdc0: 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b  T selftest_init;
fdd0: 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  \n".    "CREATE 
fde0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
fdf0: 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22  STS selftest(\n"
fe00: 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45  .    "  tno INTE
fe10: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
fe20: 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75  \n"   /* Test nu
fe30: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f  mber */.    "  o
fe40: 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  p TEXT,\n"      
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe60: 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20  Operator:  memo 
fe70: 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d  run */.    "  cm
fe80: 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  d TEXT,\n"      
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
fea0: 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20  ommand text */. 
feb0: 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e     "  ans TEXT\n
fec0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fed0: 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61      /* Desired a
fee0: 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b  nswer */.    ");
fef0: 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45  ".    "CREATE TE
ff00: 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  MP TABLE [_shell
ff10: 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e  $self](op,cmd,an
ff20: 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  s);\n".    "INSE
ff30: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
ff40: 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63  self](rowid,op,c
ff50: 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41  md)\n".    "  VA
ff60: 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53  LUES(coalesce((S
ff70: 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b  ELECT (max(tno)+
ff80: 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c  100)/10 FROM sel
ff90: 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20  ftest),10),\n". 
ffa0: 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65     "         'me
ffb0: 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72  mo','Tests gener
ffc0: 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29  ated by --init')
ffd0: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
ffe0: 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
fff0: 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45  lf]\n".    "  SE
10000 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20  LECT 'run',\n". 
10010 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20     "    'SELECT 
10020 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
10030 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  'SELECT type,nam
10040 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22  e,tbl_name,sql "
10050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
10080 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
10090 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20  '',224))',\n".  
100a0 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f    "    hex(sha3_
100b0 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79  query('SELECT ty
100c0 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
100d0 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
10100 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
10110 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22  ,224));\n".    "
10120 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
10130 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
10140 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
10150 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c  ,".    "    'SEL
10160 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65  ECT hex(sha3_que
10170 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52  ry(''SELECT * FR
10180 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22  OM \"' ||".    "
10190 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27          printf('
101a0 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22  %w',name) || '\"
101b0 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32   NOT INDEXED'',2
101c0 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20  24))',\n".    " 
101d0 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72     hex(sha3_quer
101e0 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54  y(printf('SELECT
101f0 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e   * FROM \"%w\" N
10200 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65  OT INDEXED',name
10210 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22  ),224))\n".    "
10220 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20    FROM (\n".    
10230 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  "    SELECT name
10240 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
10250 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ter\n".    "    
10260 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
10270 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  le'\n".    "    
10280 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65     AND name<>'se
10290 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22  lftest'\n".    "
102a0 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65         AND coale
102b0 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
102c0 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22  0\n".    "  )\n"
102d0 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20  .    " ORDER BY 
102e0 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  name;\n".    "IN
102f0 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
10300 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22  l$self]\n".    "
10310 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27    VALUES('run','
10320 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
10330 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e  _check','ok');\n
10340 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10350 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c  TO selftest(tno,
10360 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20  op,cmd,ans)".   
10370 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64   "  SELECT rowid
10380 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46  *10,op,cmd,ans F
10390 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  ROM [_shell$self
103a0 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20  ];\n".    "DROP 
103b0 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65  TABLE [_shell$se
103c0 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26  lf];".    ,0,0,&
103d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
103e0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
103f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
10400 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69  r, "SELFTEST ini
10410 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
10420 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ure: %s\n", zErr
10430 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
10440 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
10450 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
10460 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
10470 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  ASE selftest_ini
10480 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f  t",0,0,0);.}.../
10490 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
104a0 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66  tination table f
104b0 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c  ield of the Shel
104c0 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65  lState structure
104d0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
104e0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
104f0 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
10500 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
10510 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
10520 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
10530 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
10540 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20  name(ShellState 
10550 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
10560 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  zName){.  int i,
10570 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74   n;.  char cQuot
10580 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
10590 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62   if( p->zDestTab
105a0 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  le ){.    free(p
105b0 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
105c0 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
105d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
105e0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
105f0 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75  n;.  cQuote = qu
10600 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a  oteChar(zName);.
10610 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
10620 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75  Name);.  if( cQu
10630 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a  ote ) n += n+2;.
10640 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61    z = p->zDestTa
10650 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b  ble = malloc( n+
10660 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  1 );.  if( z==0 
10670 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
10680 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20 30  emory();.  n = 0
10690 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  ;.  if( cQuote )
106a0 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65   z[n++] = cQuote
106b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
106c0 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
106d0 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
106e0 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
106f0 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a  e[i]==cQuote ) z
10700 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a  [n++] = cQuote;.
10710 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74 65    }.  if( cQuote
10720 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
10730 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a  te;.  z[n] = 0;.
10740 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  }.../*.** Execut
10750 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65 6d  e a query statem
10760 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65  ent that will ge
10770 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75  nerate SQL outpu
10780 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65  t.  Print.** the
10790 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c   result columns,
107a0 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   comma-separated
107b0 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20  , on a line and 
107c0 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65  then add a.** se
107d0 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
107e0 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
107f0 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
10800 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
10810 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20  of columns is 1 
10820 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  and that column 
10830 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d  contains text "-
10840 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  -".** then write
10850 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f   the semicolon o
10860 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e  n a separate lin
10870 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69 66  e.  That way, if
10880 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65   a.** "--" comme
10890 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  nt occurs at the
108a0 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74   end of the stat
108b0 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65  ement, the comme
108c0 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73  nt.** won't cons
108d0 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ume the semicolo
108e0 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  n terminator..*/
108f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f  .static int run_
10900 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
10910 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
10920 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
10930 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f  Query context */
10940 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10950 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53  Select,     /* S
10960 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10970 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65  to extract conte
10980 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
10990 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20  ar *zFirstRow   
109a0 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65   /* Print before
109b0 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e   first row, if n
109c0 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
109d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
109e0 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b  elect;.  int rc;
109f0 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a  .  int nResult;.
10a00 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
10a10 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d   char *z;.  rc =
10a20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
10a30 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65  _v2(p->db, zSele
10a40 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74  ct, -1, &pSelect
10a50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
10a60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53  SQLITE_OK || !pS
10a70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74 66  elect ){.    utf
10a80 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10a90 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28   "/**** ERROR: (
10aa0 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22  %d) %s *****/\n"
10ab0 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  , rc,.          
10ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
10ad0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
10ae0 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21    if( (rc&0xff)!
10af0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
10b00 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  ) p->nErr++;.   
10b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10b30 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  tep(pSelect);.  
10b40 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
10b50 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
10b60 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65  Select);.  while
10b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
10b80 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72   ){.    if( zFir
10b90 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 75  stRow ){.      u
10ba0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10bb0 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52  t, "%s", zFirstR
10bc0 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73  ow);.      zFirs
10bd0 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  tRow = 0;.    }.
10be0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
10bf0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
10c00 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74  umn_text(pSelect
10c10 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  , 0);.    utf8_p
10c20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
10c30 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28  s", z);.    for(
10c40 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=1; i<nResult; 
10c50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66 38  i++){.      utf8
10c60 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10c70 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ",%s", sqlite3_c
10c80 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
10c90 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ct, i));.    }. 
10ca0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
10cb0 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  = "";.    while(
10cc0 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d   z[0] && (z[0]!=
10cd0 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27  '-' || z[1]!='-'
10ce0 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ) ) z++;.    if(
10cf0 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 72   z[0] ){.      r
10d00 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10d10 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20  , "\n;\n");.    
10d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
10d30 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10d40 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ";\n");.    }.  
10d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10d60 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  tep(pSelect);.  
10d70 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10d80 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63  _finalize(pSelec
10d90 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
10da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
10db0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10dc0 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a  t, "/**** ERROR:
10dd0 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c   (%d) %s *****/\
10de0 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20  n", rc,.        
10df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10e00 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
10e10 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
10e20 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )!=SQLITE_CORRUP
10e30 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  T ) p->nErr++;. 
10e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10e50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
10e60 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76 65  e space and save
10e70 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72 72   off current err
10e80 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  or string..*/.st
10e90 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65 5f  atic char *save_
10ea0 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74  err_msg(.  sqlit
10eb0 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20 20  e3 *db          
10ec0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
10ed0 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69   query */.){.  i
10ee0 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73  nt nErrMsg = 1+s
10ef0 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
10f00 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 63  errmsg(db));.  c
10f10 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73  har *zErrMsg = s
10f20 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
10f30 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  nErrMsg);.  if( 
10f40 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d  zErrMsg ){.    m
10f50 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73  emcpy(zErrMsg, s
10f60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10f70 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ), nErrMsg);.  }
10f80 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73  .  return zErrMs
10f90 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  g;.}..#ifdef __l
10fa0 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74  inux__./*.** Att
10fb0 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79 20  empt to display 
10fc0 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e  I/O stats on Lin
10fd0 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50  ux using /proc/P
10fe0 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20  ID/io.*/.static 
10ff0 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e 75  void displayLinu
11000 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a 6f  xIoStats(FILE *o
11010 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  ut){.  FILE *in;
11020 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a  .  char z[200];.
11030 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11040 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
11050 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20   "/proc/%d/io", 
11060 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e 20  getpid());.  in 
11070 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29  = fopen(z, "rb")
11080 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
11090 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
110a0 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66   fgets(z, sizeof
110b0 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20  (z), in)!=0 ){. 
110c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
110d0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63  struct {.      c
110e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74  onst char *zPatt
110f0 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ern;.      const
11100 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20   char *zDesc;.  
11110 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b    } aTrans[] = {
11120 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72 3a  .      { "rchar:
11130 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11140 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63 65       "Bytes rece
11150 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a 22  ived by read():"
11160 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63 68   },.      { "wch
11170 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
11180 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 73          "Bytes s
11190 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a 22  ent to write():"
111a0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
111b0 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20 20  syscr: ",       
111c0 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61 64             "Read
111d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a  () system calls:
111e0 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  "      },.      
111f0 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20 20  { "syscw: ",    
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
11210 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  rite() system ca
11220 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20  lls:"     },.   
11230 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65 73     { "read_bytes
11240 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
11250 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72 6f   "Bytes read fro
11260 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a  m storage:"  },.
11270 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f 62        { "write_b
11280 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20  ytes: ",        
11290 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74 74      "Bytes writt
112a0 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22 20  en to storage:" 
112b0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e 63  },.      { "canc
112c0 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74 65  elled_write_byte
112d0 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65  s: ",  "Cancelle
112e0 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22 20  d write bytes:" 
112f0 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
11300 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
11310 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
11320 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a  (aTrans); i++){.
11330 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
11340 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d  rlen30(aTrans[i]
11350 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  .zPattern);.    
11360 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54    if( strncmp(aT
11370 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11380 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  , z, n)==0 ){.  
11390 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
113a0 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
113b0 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65  ", aTrans[i].zDe
113c0 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20  sc, &z[n]);.    
113d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
113e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
113f0 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e  close(in);.}.#en
11400 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  dif../*.** Displ
11410 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65  ay a single line
11420 20 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e 67   of status using
11430 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a   64-bit values..
11440 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
11450 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a  isplayStatLine(.
11460 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
11470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11480 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74  he shell context
11490 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62   */.  char *zLab
114a0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
114b0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69  /* Label for thi
114c0 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20  s one line */.  
114d0 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20  char *zFormat,  
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
114f0 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65 73 75  mat for the resu
11500 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  lt */.  int iSta
11510 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20  tusCtrl,        
11520 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75    /* Which statu
11530 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a  s to display */.
11540 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
11550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11560 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
11570 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73   stats */.){.  s
11580 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75  qlite3_int64 iCu
11590 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  r = -1;.  sqlite
115a0 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d  3_int64 iHiwtr =
115b0 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50   -1;.  int i, nP
115c0 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a  ercent;.  char z
115d0 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  Line[200];.  sql
115e0 69 74 65 33 5f 73 74 61 74 75 73 36 34 28 69 53  ite3_status64(iS
115f0 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72  tatusCtrl, &iCur
11600 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
11610 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e  t);.  for(i=0, n
11620 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d  Percent=0; zForm
11630 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  at[i]; i++){.   
11640 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d   if( zFormat[i]=
11650 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b  ='%' ) nPercent+
11660 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65  +;.  }.  if( nPe
11670 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73  rcent>1 ){.    s
11680 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11690 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
116a0 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
116b0 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
116c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
116d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
116e0 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65  of(zLine), zLine
116f0 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74  , zFormat, iHiwt
11700 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72  r);.  }.  raw_pr
11710 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
11720 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65  36s %s\n", zLabe
11730 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a  l, zLine);.}../*
11740 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f  .** Display memo
11750 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  ry stats..*/.sta
11760 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f  tic int display_
11770 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
11780 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11790 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
117a0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
117b0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
117c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
117d0 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
117e0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ate */.  int bRe
117f0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11800 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
11810 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
11820 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
11830 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a  ;.  int iHiwtr;.
11840 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 69    FILE *out;.  i
11850 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70 41  f( pArg==0 || pA
11860 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65 74  rg->out==0 ) ret
11870 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20 70  urn 0;.  out = p
11880 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66 28  Arg->out;..  if(
11890 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26 20   pArg->pStmt && 
118a0 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 26  (pArg->statsOn &
118b0 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   2) ){.    int n
118c0 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20 73  Col, i, x;.    s
118d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
118e0 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  mt = pArg->pStmt
118f0 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
11900 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  ];.    nCol = sq
11910 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
11920 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  nt(pStmt);.    r
11930 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
11940 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e 75  %-36s %d\n", "Nu
11950 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
11960 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29 3b  olumns:", nCol);
11970 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11980 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11990 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
119a0 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c 22  tf(sizeof(z),z,"
119b0 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d 65  Column %d %nname
119c0 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20 20  :", i, &x);.    
119d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
119e0 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
119f0 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
11a00 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
11a10 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
11a20 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
11a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11a40 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11a50 22 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a 22  "declared type:"
11a60 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11a70 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11a80 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11a90 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
11aa0 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 23  pe(pStmt, i));.#
11ab0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
11ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
11ad0 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
11ae0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11af0 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74 61  f(30, z+x, "data
11b00 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  base name:");.  
11b10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11b20 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11b30 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11b40 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
11b50 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
11b60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11b70 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 74  intf(30, z+x, "t
11b80 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  able name:");.  
11b90 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11ba0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11bb0 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11bc0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28  lumn_table_name(
11bd0 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
11be0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11bf0 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69 67  f(30, z+x, "orig
11c00 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20  in name:");.    
11c10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
11c20 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11c30 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
11c40 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 70  mn_origin_name(p
11c50 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69 66  Stmt,i));.#endif
11c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 69  .    }.  }..  di
11c70 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11c80 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64  rg, "Memory Used
11c90 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11ca0 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11cb0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11cc0 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65  MEMORY_USED, bRe
11cd0 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53  set);.  displayS
11ce0 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11cf0 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e  umber of Outstan
11d00 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73  ding Allocations
11d10 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11d20 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
11d30 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
11d40 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b  _COUNT, bReset);
11d50 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65  .  if( pArg->she
11d60 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50  llFlgs & SHFLG_P
11d70 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20  agecache ){.    
11d80 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11d90 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
11da0 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
11db0 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  ed:",.       "%l
11dc0 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70 61  ld (max %lld) pa
11dd0 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ges", SQLITE_STA
11de0 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53  TUS_PAGECACHE_US
11df0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 7d  ED, bReset);.  }
11e00 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11e10 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11e20 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66   of Pcache Overf
11e30 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20  low Bytes:",.   
11e40 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11e50 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
11e60 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11e70 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65  HE_OVERFLOW, bRe
11e80 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53  set);.  displayS
11e90 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c  tatLine(pArg, "L
11ea0 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f  argest Allocatio
11eb0 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  n:",.     "%lld 
11ec0 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11ed0 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
11ee0 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  E, bReset);.  di
11ef0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11f00 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61  rg, "Largest Pca
11f10 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22  che Allocation:"
11f20 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74  ,.     "%lld byt
11f30 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11f40 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
11f50 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64  E, bReset);.#ifd
11f60 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
11f70 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c 61  CKDEPTH.  displa
11f80 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11f90 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20  "Deepest Parser 
11fa0 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22 25  Stack:",.     "%
11fb0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
11fc0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11fd0 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65  ARSER_STACK, bRe
11fe0 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  set);.#endif..  
11ff0 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66  if( db ){.    if
12000 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67  ( pArg->shellFlg
12010 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  s & SHFLG_Lookas
12020 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69  ide ){.      iHi
12030 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
12040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
12050 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
12060 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
12070 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20  KASIDE_USED,.   
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
120a0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
120b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
120c0 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
120d0 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69          "Lookasi
120e0 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20  de Slots Used:  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12100 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20   (max %d)\n",.  
12110 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
12120 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20  , iHiwtr);.     
12130 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
12140 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
12150 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
12160 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20  _HIT,.          
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
12180 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
12190 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
121a0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
121b0 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c  t, "Successful l
121c0 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74  ookaside attempt
121d0 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a  s:       %d\n",.
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
121f0 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iwtr);.      sql
12200 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12210 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12220 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  US_LOOKASIDE_MIS
12230 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  S_SIZE,.        
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12260 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
12270 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12280 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20  out, "Lookaside 
12290 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20  failures due to 
122a0 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22  size:      %d\n"
122b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
122c0 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
122d0 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
122e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
122f0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
12300 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20  ISS_FULL,.      
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
12330 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
12340 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12350 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
12360 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
12370 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c  o OOM:       %d\
12380 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12390 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d    iHiwtr);.    }
123a0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
123b0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
123c0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
123d0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
123e0 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26  US_CACHE_USED, &
123f0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12400 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12410 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12420 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73  , "Pager Heap Us
12430 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
12440 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
12450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12460 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12470 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12480 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12490 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
124a0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
124b0 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  HIT, &iCur, &iHi
124c0 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
124d0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
124e0 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68  t, "Page cache h
124f0 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  its:            
12500 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12510 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12520 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12530 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12540 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12550 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d  DBSTATUS_CACHE_M
12560 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ISS, &iCur, &iHi
12570 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
12580 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12590 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d  t, "Page cache m
125a0 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20  isses:          
125b0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
125c0 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
125d0 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
125e0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
125f0 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12600 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57  DBSTATUS_CACHE_W
12610 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48  RITE, &iCur, &iH
12620 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
12630 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12640 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
12650 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20  writes:         
12660 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12670 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12680 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12690 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
126a0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
126b0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
126c0 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69  SPILL, &iCur, &i
126d0 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
126e0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
126f0 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
12700 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20 20   spills:        
12710 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12720 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
12730 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
12740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
12750 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
12760 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d  E_DBSTATUS_SCHEM
12770 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  A_USED, &iCur, &
12780 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
12790 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
127a0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65  pArg->out, "Sche
127b0 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  ma Heap Usage:  
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
127e0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
127f0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
12800 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
12810 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12820 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12830 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69  US_STMT_USED, &i
12840 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
12850 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12860 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12870 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70   "Statement Heap
12880 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65  /Lookaside Usage
12890 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c  :      %d bytes\
128a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
128b0 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  iCur);.  }..  if
128c0 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b  ( pArg->pStmt ){
128d0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
128e0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
128f0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12900 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
12910 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20  ULLSCAN_STEP,.  
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65               bRe
12940 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12950 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12960 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12990 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
129a0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
129b0 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
129c0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
129d0 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
129e0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
129f0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74  pArg->out, "Sort
12a00 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20   Operations:    
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12a30 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12a40 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12a50 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12a60 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
12a70 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a  OINDEX,bReset);.
12a80 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12a90 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69  Arg->out, "Autoi
12aa0 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20  ndex Inserts:   
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12ad0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12ae0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12af0 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12b00 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
12b10 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  TEP, bReset);.  
12b20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12b30 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c  g->out, "Virtual
12b40 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20   Machine Steps: 
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12b60 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12b70 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12b80 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12b90 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12ba0 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
12bb0 41 52 45 2c 62 52 65 73 65 74 29 3b 0a 20 20 20  ARE,bReset);.   
12bc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12bd0 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70 61 72  ->out, "Reprepar
12be0 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  e operations:   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12c00 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12c10 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12c20 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12c30 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12c40 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20 62 52  MTSTATUS_RUN, bR
12c50 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12c60 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12c70 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65   "Number of time
12c80 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20 20 20  s run:          
12c90 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12ca0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12cb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12cc0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12cd0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12ce0 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52 65 73  US_MEMUSED, bRes
12cf0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12d00 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12d10 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 70  Memory used by p
12d20 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20 20 20  repared stmt:   
12d30 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12d40 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
12d50 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
12d60 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
12d70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
12d80 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
12d90 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
12da0 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
12db0 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
12dc0 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
12dd0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12de0 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
12df0 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
12e00 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
12e10 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
12e20 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e40 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
12e50 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
12e60 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
12e70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12e80 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
12e90 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
12ea0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
12eb0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
12ec0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12ed0 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
12ee0 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
12ef0 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
12f00 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
12f10 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12f20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
12f30 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
12f40 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
12f50 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
12f60 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
12f70 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
12f80 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
12f90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
12fa0 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
12fb0 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
12fc0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12fd0 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
12fe0 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
12ff0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
13000 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
13010 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
13020 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
13030 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13040 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13050 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
13060 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
13070 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13080 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13090 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
130a0 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
130b0 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
130c0 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
130d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
130e0 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
130f0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
13100 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
13110 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
13120 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
13130 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
13140 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
13150 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
13160 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
13170 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
13180 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
13190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
131a0 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
131b0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
131c0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
131d0 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
131e0 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
131f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13200 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13210 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13220 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
13230 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
13240 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13250 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13260 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
13270 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
13280 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
13290 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
132a0 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
132b0 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
132c0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
132d0 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
132e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
132f0 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
13300 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
13310 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
13320 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
13330 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
13340 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
13350 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
13360 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
13370 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
13380 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
13390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
133a0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
133b0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
133d0 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
133e0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
133f0 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
13400 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
13410 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
13420 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
13430 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
13440 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
13450 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
13460 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
13470 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
13480 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
13490 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
134a0 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
134b0 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
134c0 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
134d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134e0 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
134f0 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
13500 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
13510 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
13520 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
13530 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
13540 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
13550 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
13560 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
13570 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13580 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
13590 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
135a0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
135b0 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
135c0 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
135d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
135e0 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
135f0 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
13600 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
13610 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
13620 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
13630 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
13640 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
13650 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
13660 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
13670 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13680 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
13690 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
136a0 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
136b0 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
136c0 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
136d0 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
136e0 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
136f0 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
13700 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
13710 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
13720 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
13730 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
13740 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
13750 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
13760 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
13770 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
13780 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
13790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
137a0 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
137b0 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
137c0 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
137d0 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
137e0 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
137f0 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
13800 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
13810 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
13820 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
13830 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
13840 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
13850 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
13860 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13870 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
13880 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
13890 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
138a0 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
138b0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
138c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
138d0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
138e0 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
138f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
13920 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
13930 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
13940 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13960 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
13970 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
13980 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139a0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
139b0 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
139c0 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
139d0 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
13a00 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
13a10 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
13a20 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
13a30 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
13a40 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
13a50 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
13a60 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  ext", 0 };.  con
13a70 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
13a80 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
13a90 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
13aa0 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
13ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
13ad0 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
13ae0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
13af0 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
13b00 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
13b10 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
13b20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
13b30 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
13b40 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
13b50 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
13b60 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
13b70 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
13b80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
13b90 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
13ba0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
13bb0 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
13bc0 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
13bd0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
13be0 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
13bf0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
13c00 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
13c10 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
13c20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
13c30 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
13c40 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
13c50 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13c60 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
13c70 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
13c80 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
13c90 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
13ca0 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
13cb0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13cc0 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
13cd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13ce0 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13cf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13d00 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
13d10 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
13d20 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13d30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
13d40 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
13d50 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
13d60 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
13d70 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
13d80 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
13d90 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
13da0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
13db0 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
13dc0 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
13dd0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
13de0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
13df0 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
13e00 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
13e10 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
13e20 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
13e30 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
13e40 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
13e50 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
13e60 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
13e70 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
13e80 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
13e90 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
13ea0 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
13eb0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
13ec0 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
13ed0 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
13ee0 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
13ef0 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
13f00 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
13f10 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
13f20 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
13f30 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
13f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13f50 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
13f60 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
13f70 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
13f80 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
13f90 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
13fa0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
13fb0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13fc0 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
13fd0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
13fe0 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
13ff0 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
14000 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
14010 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
14020 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
14030 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
14040 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
14050 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
14060 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
14070 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
14080 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
14090 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
140a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
140b0 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
140c0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
140d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
140e0 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
140f0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14110 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14120 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
14130 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
14140 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
14150 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
14160 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
14170 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14180 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49 6e 64      if( p->aiInd
14190 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ent==0 ) shell_o
141a0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
141b0 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20        abYield = 
141c0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
141d0 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c  alloc64(abYield,
141e0 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
141f0 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14200 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73 68 65  abYield==0 ) she
14210 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
14220 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ();.    }.    ab
14230 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
14240 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
14250 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
14260 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
14270 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
14280 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
14290 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
142a0 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
142b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
142c0 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
142d0 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
142e0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
142f0 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
14300 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
14310 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
14320 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
14330 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
14340 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
14350 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
14360 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
14370 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
14380 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
14390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
143a0 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
143b0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
143c0 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
143d0 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
143e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
143f0 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
14400 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
14410 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
14420 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
14430 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
14440 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
14450 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
14460 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
14470 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
14480 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
14490 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
144a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
144b0 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
144c0 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
144d0 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
144e0 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
144f0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
14500 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14510 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14520 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
14530 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
14540 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
14550 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
14560 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
14570 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14580 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
14590 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
145a0 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
145b0 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
145c0 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
145d0 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
145e0 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
145f0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
14600 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
14610 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
14620 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
14630 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14640 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14650 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
14660 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
14670 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
14680 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14690 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
146a0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
146b0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
146c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
146d0 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
146e0 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
146f0 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
14700 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
14710 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
14720 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
14730 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
14740 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
14750 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
14760 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14770 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14780 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
14790 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
147a0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
147b0 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
147c0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
147d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
147e0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
147f0 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
14800 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
14810 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
14820 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
14830 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  dif.}../* Create
14840 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20   the TEMP table 
14850 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70 61  used to store pa
14860 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
14870 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
14880 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28  bind_table_init(
14890 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
148a0 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61 20 3d    int wrSchema =
148b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62   0;.  sqlite3_db
148c0 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
148d0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
148e0 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
148f0 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b 0a  -1, &wrSchema);.
14900 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
14910 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
14920 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
14930 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c 20 30  BLE_SCHEMA, 1, 0
14940 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
14950 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 43 52  c(p->db,.    "CR
14960 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
14970 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e 73 71  T EXISTS temp.sq
14980 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28  lite_parameters(
14990 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20 54  \n".    "  key T
149a0 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
149b0 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75 65  \n".    "  value
149c0 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20 57   ANY\n".    ") W
149d0 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c 0a  ITHOUT ROWID;",.
149e0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
149f0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
14a00 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  g(p->db, SQLITE_
14a10 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c  DBCONFIG_WRITABL
14a20 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63 68 65  E_SCHEMA, wrSche
14a30 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ma, 0);.}../*.**
14a40 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   Bind parameters
14a50 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64 20 73   on a prepared s
14a60 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
14a70 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  Parameter bindin
14a80 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
14a90 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 6f  m a TEMP table o
14aa0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
14ab0 2a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50  *    CREATE TEMP
14ac0 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 70 61   TABLE sqlite_pa
14ad0 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54 45 58  rameters(key TEX
14ae0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  T PRIMARY KEY, v
14af0 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49 54 48  alue).**    WITH
14b00 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
14b10 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f 63 63   No bindings occ
14b20 75 72 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ur if this table
14b30 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
14b40 20 20 54 68 65 20 73 70 65 63 69 61 6c 20 63 68    The special ch
14b50 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a 20 69  aracter '$'.** i
14b60 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
14b70 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
14b80 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63 6f 6c  help prevent col
14b90 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61 63 74  lisions with act
14ba0 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 54  ual tables..** T
14bb0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
14bc0 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63 68   in the TEMP sch
14bd0 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ema..*/.static v
14be0 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61 72 65  oid bind_prepare
14bf0 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74 61 74  d_stmt(ShellStat
14c00 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33  e *pArg, sqlite3
14c10 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
14c20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69 6e 74   int nVar;.  int
14c30 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
14c40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
14c50 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20 3d 20   = 0;..  nVar = 
14c60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
14c70 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
14c80 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 3d  mt);.  if( nVar=
14c90 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
14ca0 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   Nothing to do *
14cb0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
14cc0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
14cd0 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62 2c 20  adata(pArg->db, 
14ce0 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74 65 5f  "TEMP", "sqlite_
14cf0 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20 20 20  parameters",.   
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30 2c   "key", 0, 0, 0,
14d30 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 4f   0, 0)!=SQLITE_O
14d40 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  K ){.    return;
14d50 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74 61   /* Parameter ta
14d60 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
14d70 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d  st */.  }.  rc =
14d80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
14d90 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20 20  _v2(pArg->db,.  
14da0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
14db0 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70 2e  value FROM temp.
14dc0 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14dd0 73 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  s".          " W
14de0 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20 2d 31  HERE key=?1", -1
14df0 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69 66 28  , &pQ, 0);.  if(
14e00 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29 20 72   rc || pQ==0 ) r
14e10 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
14e20 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
14e30 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33  .    char zNum[3
14e40 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0];.    const ch
14e50 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
14e60 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
14e70 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
14e80 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 3d 3d  ;.    if( zVar==
14e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14ea0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
14eb0 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c 22 3f  of(zNum),zNum,"?
14ec0 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 7a 56  %d",i);.      zV
14ed0 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20 20 7d  ar = zNum;.    }
14ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
14ef0 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20 7a 56  d_text(pQ, 1, zV
14f00 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  ar, -1, SQLITE_S
14f10 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20  TATIC);.    if( 
14f20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 29  sqlite3_step(pQ)
14f30 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
14f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
14f50 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20  nd_value(pStmt, 
14f60 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  i, sqlite3_colum
14f70 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29 29 3b  n_value(pQ, 0));
14f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14f90 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
14fa0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ull(pStmt, i);. 
14fb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14fc0 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20 7d 0a  _reset(pQ);.  }.
14fd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
14fe0 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze(pQ);.}../*.**
14ff0 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
15000 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
15010 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
15020 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
15030 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
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 20 20 20 20 20 20 20 20 20                  
15060 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
15070 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
15080 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15090 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
150b0 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
150c0 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
150d0 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
150e0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
150f0 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
15100 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
15110 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
15120 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
15130 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
15140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
15150 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
15160 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
15170 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
15180 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
15190 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
151a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
151b0 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
151c0 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
151d0 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
151e0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
151f0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
15200 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
15210 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
15220 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
15230 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
15240 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
15250 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
15260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15270 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
15280 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
15290 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
152a0 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
152b0 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
152c0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
152d0 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
152e0 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
152f0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
15300 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
15310 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
15320 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
15330 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
15340 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
15350 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
15360 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
15370 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
15380 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
15390 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
153a0 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
153b0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
153c0 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
153d0 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
153e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
153f0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
15400 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
15410 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
15420 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
15430 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
15440 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15450 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15460 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
15470 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
15480 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
15490 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
154a0 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
154b0 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
154c0 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
154d0 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
154e0 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
154f0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
15500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15510 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
15520 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
15530 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15540 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
15550 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
15560 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
15570 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
15580 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
15590 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
155a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
155b0 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
155c0 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
155d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
155e0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
155f0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
15600 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
15610 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
15620 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
15630 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
15640 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
15650 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
15660 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
15670 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
15680 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
15690 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
156a0 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
156b0 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
156c0 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
156e0 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
156f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
15700 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
15710 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
15720 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
15730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15740 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
15750 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
15760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15770 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
15780 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
15790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
157a0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
157b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
157c0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
157d0 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
157e0 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
157f0 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
15800 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
15810 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
15820 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15830 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
15840 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
15850 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
15860 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
15870 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15880 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15890 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
158a0 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
158b0 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
158c0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
158d0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
158e0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
158f0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
15900 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
15910 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
15920 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15930 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15940 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
15950 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
15960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
15970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15980 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
15990 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
159a0 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
159b0 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
159c0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
159d0 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
159e0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
159f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
15a00 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
15a10 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
15a20 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
15a30 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
15a40 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
15a50 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
15a60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15a70 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
15a80 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
15a90 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
15aa0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
15ab0 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
15ac0 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
15ad0 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
15ae0 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
15af0 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
15b00 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
15b10 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
15b20 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15b30 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
15b40 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15b50 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
15b60 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
15b70 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
15b80 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
15b90 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
15ba0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
15bb0 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
15bc0 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
15bd0 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
15be0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15bf0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15c00 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15c10 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
15c20 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
15c30 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
15c40 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
15c50 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15c60 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
15c70 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
15c80 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
15c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15ca0 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
15cb0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
15cc0 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
15cd0 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
15ce0 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
15cf0 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
15d00 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
15d10 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
15d20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
15d30 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
15d40 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
15d50 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15d60 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
15d70 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
15d80 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
15d90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15db0 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
15dc0 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
15dd0 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
15de0 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
15df0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
15e00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
15e10 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
15e20 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
15e30 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
15e40 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
15e50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15e60 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
15e70 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
15e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
15e90 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
15ea0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
15eb0 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
15ec0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15ed0 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
15ee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
15ef0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
15f00 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15f10 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15f20 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
15f30 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15f40 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
15f50 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
15f60 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
15f70 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
15f80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15f90 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
15fa0 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15fb0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15fc0 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
15fd0 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
15fe0 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
15ff0 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
16000 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
16010 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
16020 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
16030 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
16040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
16060 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
16070 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
16080 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
16090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
160a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
160b0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
160c0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
160d0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
160e0 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
160f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16100 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
16110 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
16120 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16130 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
16150 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
16160 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
16170 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
16180 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
16190 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
161a0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
161b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
161c0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
161d0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
161e0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
161f0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
16200 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
16210 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
16220 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
16230 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16250 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16260 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
16270 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16280 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
16290 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
162a0 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
162b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
162c0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
162d0 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
162e0 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
162f0 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
16300 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
16310 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
16320 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
16330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
16340 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
16350 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
16360 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
16370 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
16380 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
16390 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
163a0 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
163b0 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
163c0 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
163d0 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
163e0 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
163f0 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
16400 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
16410 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
16420 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
16430 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
16440 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16450 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
16460 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
16470 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
16480 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16490 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
164a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
164b0 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
164c0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
164d0 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
164e0 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
164f0 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
16500 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
16510 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
16520 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
16530 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
16540 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
16550 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
16580 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
16590 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
165a0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
165b0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
165c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
165d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
165e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
165f0 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
16600 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
16610 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
16620 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
16630 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
16640 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16650 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
16660 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
16670 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
16680 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
16690 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
166a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
166b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
166c0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
166d0 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
166e0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
166f0 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
16700 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
16710 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
16720 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16730 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16740 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
16750 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16760 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
16770 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
16780 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
16790 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
167a0 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
167b0 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
167c0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
167d0 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
167e0 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
167f0 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
16800 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
16810 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
16820 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
16830 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
16840 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
16850 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
16860 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
16870 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
16880 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
16890 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
168a0 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
168b0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
168c0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
168d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
168e0 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
168f0 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
16900 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
16930 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
16940 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16970 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
16980 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
16990 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
169a0 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
169b0 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
169c0 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
169d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
169e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
169f0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
16a00 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
16a10 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
16a20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
16a30 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
16a40 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
16a50 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
16a60 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
16a70 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
16a80 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
16a90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16aa0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
16ab0 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
16ac0 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
16ad0 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
16ae0 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
16af0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
16b00 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
16b10 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
16b20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
16b30 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
16b40 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
16b50 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
16b60 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
16b70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16b80 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
16b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
16ba0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
16bb0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
16bc0 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
16bd0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
16be0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
16bf0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
16c00 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16c10 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
16c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16c40 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
16c50 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
16c60 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
16c70 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
16c80 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
16c90 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
16ca0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
16cb0 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
16cc0 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
16cd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
16ce0 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
16cf0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
16d00 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
16d10 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
16d20 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
16d30 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
16d40 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
16d50 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
16d60 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
16d70 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16d80 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
16d90 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
16da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16db0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
16dc0 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
16dd0 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
16de0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
16df0 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
16e00 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
16e10 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
16e20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
16e30 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
16e40 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
16e50 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
16e60 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
16e70 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
16e80 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
16e90 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
16ea0 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
16eb0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
16ec0 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
16ed0 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16ee0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
16ef0 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
16f00 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e  3_stmt_isexplain
16f10 28 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20  (pStmt)==0 ){.  
16f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
16f30 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20  mt *pExplain;.  
16f40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50        char *zEQP
16f50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 72  ;.        int tr
16f60 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20  iggerEQP = 0;.  
16f70 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65        disable_de
16f80 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
16f90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16fa0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
16fb0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
16fc0 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31  _TRIGGER_EQP, -1
16fd0 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a  , &triggerEQP);.
16fe0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
16ff0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17000 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20  QP_trigger ){.  
17010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17020 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
17030 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
17040 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29  IGGER_EQP, 1, 0)
17050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17060 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74      zEQP = sqlit
17070 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
17080 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
17090 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
170a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
170b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
170c0 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
170d0 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
170e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
170f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17100 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
17110 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
17120 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
17130 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
17140 74 20 63 68 61 72 20 2a 7a 45 51 50 4c 69 6e 65  t char *zEQPLine
17150 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
17160 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17170 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 33 29 3b  ext(pExplain,3);
17180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
17190 20 69 45 71 70 49 64 20 3d 20 73 71 6c 69 74 65   iEqpId = sqlite
171a0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
171b0 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
171c0 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 65         int iPare
171d0 6e 74 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ntId = sqlite3_c
171e0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
171f0 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  in, 1);.        
17200 20 20 20 20 69 66 28 20 7a 45 51 50 4c 69 6e 65      if( zEQPLine
17210 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70 5f 72  [0]=='-' ) eqp_r
17220 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20  ender(pArg);.   
17230 20 20 20 20 20 20 20 20 20 65 71 70 5f 61 70 70           eqp_app
17240 65 6e 64 28 70 41 72 67 2c 20 69 45 71 70 49 64  end(pArg, iEqpId
17250 2c 20 69 50 61 72 65 6e 74 49 64 2c 20 7a 45 51  , iParentId, zEQ
17260 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  PLine);.        
17270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 71    }.          eq
17280 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
17290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
172a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
172b0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
172d0 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
172e0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
172f0 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
17300 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
17310 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
17320 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
17330 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
17340 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
17350 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
17360 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
17370 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
17380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17390 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
173a0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
173b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
173c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
173d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
173e0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
173f0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
17400 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
17410 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
17420 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17430 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
17440 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
17450 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17460 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
17470 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17480 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
17490 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
174a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
174b0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
174c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
174d0 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
174e0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
174f0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17500 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72  QP_trigger && tr
17510 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20  iggerEQP==0 ){. 
17520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17530 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
17540 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
17550 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30  RIGGER_EQP, 0, 0
17560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
17570 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20  Reprepare pStmt 
17580 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e  before reactivin
17590 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f  g trace modes */
175a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
175b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
175c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
175d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
175e0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
175f0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
17600 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 20       if( pArg ) 
17610 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53  pArg->pStmt = pS
17620 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
17630 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64         restore_d
17640 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
17650 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ();.      }..   
17660 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
17670 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17680 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b  de = pArg->mode;
17690 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
176a0 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29  g->autoExplain )
176b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
176c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
176d0 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 31  xplain(pStmt)==1
176e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176f0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
17700 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
17710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17720 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17730 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17740 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  mt)==2 ){.      
17750 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17760 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20  e = MODE_EQP;.  
17770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17780 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
17790 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  If the shell is 
177a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65  currently in ".e
177b0 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61  xplain" mode, ga
177c0 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20  ther the extra. 
177d0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72         ** data r
177e0 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69  equired to add i
177f0 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75  ndents to the ou
17800 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20  tput.*/.        
17810 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d  if( pArg->cMode=
17820 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
17830 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
17840 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
17850 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17870 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72 65 70  .      bind_prep
17880 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
17890 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78  pStmt);.      ex
178a0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
178b0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
178c0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
178d0 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
178e0 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
178f0 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f  (pArg);..      /
17900 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
17910 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
17920 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
17930 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
17940 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
17950 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
17960 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
17970 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  }..      /* prin
17980 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20  t loop-counters 
17990 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
179a0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
179b0 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73   pArg->scanstats
179c0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
179d0 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
179e0 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  db, pArg);.     
179f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
17a00 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
17a10 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65  ent just execute
17a20 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  d. If this fails
17a30 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  , save a.      *
17a40 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
17a50 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
17a60 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
17a70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
17a80 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
17a90 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
17aa0 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
17ab0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
17ac0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
17ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17ae0 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72  E_NOMEM ) rc = r
17af0 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
17b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17b10 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
17b20 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
17b30 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
17b40 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
17b50 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
17b60 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
17b70 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
17b80 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
17b90 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  db);.      }..  
17ba0 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76      /* clear sav
17bb0 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a  ed stmt handle *
17bc0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
17bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
17be0 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a  ->pStmt = NULL;.
17bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17c00 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a  } /* end while *
17c10 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
17c20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
17c30 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
17c40 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
17c50 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17c60 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
17c70 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  d freeColumnList
17c80 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a  (char **azCol){.
17c90 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
17ca0 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
17cb0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
17cc0 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  free(azCol[i]);.
17cd0 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30    }.  /* azCol[0
17ce0 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74  ] is a static st
17cf0 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ring */.  sqlite
17d00 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d  3_free(azCol);.}
17d10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17d20 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72   list of pointer
17d30 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69  s to strings whi
17d40 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ch are the names
17d50 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d   of all.** colum
17d60 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62  ns in table zTab
17d70 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74  .   The memory t
17d80 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
17d90 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
17da0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
17db0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
17dc0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
17dd0 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65  using a subseque
17de0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72  nt call.** to fr
17df0 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a  eeColumnList()..
17e00 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b  **.** The azCol[
17e10 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61  0] entry is usua
17e20 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76  lly NULL.  Howev
17e30 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74  er, if zTab cont
17e40 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20  ains a rowid.** 
17e50 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73  value that needs
17e60 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
17e70 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20  , then azCol[0] 
17e80 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
17e90 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  h the.** name of
17ea0 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
17eb0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
17ec0 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  st regular colum
17ed0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  n in the table i
17ee0 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65  s azCol[1].  The
17ef0 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61   list is termina
17f00 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74  ted.** by an ent
17f10 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d  ry with azCol[i]
17f20 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ==0..*/.static c
17f30 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d  har **tableColum
17f40 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65  nList(ShellState
17f50 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
17f60 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a  *zTab){.  char *
17f70 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71  *azCol = 0;.  sq
17f80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17f90 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  t;.  char *zSql;
17fa0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
17fb0 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
17fc0 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30  0;.  int nPK = 0
17fd0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
17fe0 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
17ff0 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f   columns seen */
18000 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30  .  int isIPK = 0
18010 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
18020 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59   one PRIMARY KEY
18030 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20   column of type 
18040 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74  INTEGER */.  int
18050 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18060 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
18070 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
18080 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b  owid);.  int rc;
18090 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
180a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
180b0 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
180c0 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d  ", zTab);.  rc =
180d0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
180e0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
180f0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18100 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18110 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
18120 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
18130 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
18140 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
18150 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
18160 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29  nCol>=nAlloc-2 )
18170 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d  {.      nAlloc =
18180 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c   nAlloc*2 + nCol
18190 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43   + 10;.      azC
181a0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ol = sqlite3_rea
181b0 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c  lloc(azCol, nAll
181c0 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  oc*sizeof(azCol[
181d0 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
181e0 61 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65 6c 6c  azCol==0 ) shell
181f0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
18200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
18210 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
18220 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
18230 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
18240 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
18250 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18260 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
18270 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  mt, 5) ){.      
18280 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nPK++;.      if(
18290 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26   nPK==1.       &
182a0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
182b0 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
182c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
182d0 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20  xt(pStmt,2),.   
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22         "INTEGER"
18300 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
18310 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b        isIPK = 1;
18320 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18330 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b        isIPK = 0;
18340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18350 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
18360 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
18370 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
18380 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c  eturn 0;.  azCol
18390 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c  [0] = 0;.  azCol
183a0 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20  [nCol+1] = 0;.. 
183b0 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e   /* The decision
183c0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
183d0 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c  ot a rowid reall
183e0 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  y needs to be pr
183f0 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20  eserved.  ** is 
18400 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65  tricky.  We neve
18410 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72  r need to preser
18420 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61  ve a rowid for a
18430 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18440 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74  able.  ** or a t
18450 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54  able with an INT
18460 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
18470 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65  .  We are unable
18480 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a   to preserve.  *
18490 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c  * rowids on tabl
184a0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  es where the row
184b0 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  id is inaccessib
184c0 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  le because there
184d0 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   are other.  ** 
184e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
184f0 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69  able named "rowi
18500 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61  d", "_rowid_", a
18510 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20  nd "oid"..  */. 
18520 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
18530 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20  id && isIPK ){. 
18540 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c     /* If a singl
18550 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
18560 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49  lumn with type I
18570 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c  NTEGER was seen,
18580 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
18590 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73  might be an alis
185a0 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  e for the ROWID.
185b0 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61    But it might a
185c0 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54  lso be a WITHOUT
185d0 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61   ROWID.    ** ta
185e0 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52  ble or a INTEGER
185f0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53   PRIMARY KEY DES
18600 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65  C column, neithe
18610 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20  r of which are. 
18620 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61     ** ROWID alia
18630 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67  ses.  To disting
18640 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73  uish these cases
18650 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18660 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
18670 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69  s a "pk" entry i
18680 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  n "PRAGMA index_
18690 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69  list".  There wi
186a0 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20  ll be.    ** no 
186b0 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68  "pk" index if th
186c0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65  e PRIMARY KEY re
186d0 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73  ally is an alias
186e0 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a   for the ROWID..
186f0 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
18700 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18710 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  f("SELECT 1 FROM
18720 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69   pragma_index_li
18730 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20  st(%Q)".        
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69     " WHERE origi
18760 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a  n='pk'", zTab);.
18770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18780 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
18790 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
187a0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
187b0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
187c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
187d0 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c       freeColumnL
187e0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
187f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
18800 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
18810 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
18820 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
18830 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
18840 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b   rc==SQLITE_ROW;
18860 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65  .  }.  if( prese
18870 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  rveRowid ){.    
18880 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65  /* Only preserve
18890 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65   the rowid if we
188a0 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65   can find a name
188b0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a   to use for the.
188c0 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a      ** rowid */.
188d0 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
188e0 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22  *azRowid[] = { "
188f0 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
18900 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20  ", "oid" };.    
18910 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
18920 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
18930 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
18940 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a   i<=nCol; i++){.
18950 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
18960 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f  te3_stricmp(azRo
18970 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29  wid[j],azCol[i])
18980 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
18990 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
189a0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
189b0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
189c0 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
189d0 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f  azRowid[j] is no
189e0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  t the name of an
189f0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64  y.        ** ord
18a00 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  inary column in 
18a10 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69  the table.  Veri
18a20 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  fy that azRowid[
18a30 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20  j] is a valid.  
18a40 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f        ** name fo
18a50 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f  r the rowid befo
18a60 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20  re adding it to 
18a70 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f  azCol[0].  WITHO
18a80 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT ROWID.       
18a90 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20   ** tables will 
18aa0 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63  fail this last c
18ab0 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
18ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
18ad0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
18ae0 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c  ta(p->db,0,zTab,
18af0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30  azRowid[j],0,0,0
18b00 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ,0,0);.        i
18b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b20 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a   ) azCol[0] = az
18b30 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20  Rowid[j];.      
18b40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18b60 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a  urn azCol;.}../*
18b70 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72  .** Toggle the r
18b80 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
18b90 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67  _selects setting
18ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18bb0 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18bc0 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
18bd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18be0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
18bf0 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a  t iSetting = 0;.
18c00 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30    char zStmt[100
18c10 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  ];.  sqlite3_pre
18c20 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
18c30 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18c40 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20  dered_selects", 
18c50 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
18c60 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
18c70 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
18c80 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65  E_ROW ){.    iSe
18c90 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tting = sqlite3_
18ca0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
18cb0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
18cc0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18cd0 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt);.  sqlite3_s
18ce0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
18cf0 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20  Stmt), zStmt,.  
18d00 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76       "PRAGMA rev
18d10 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
18d20 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53  elects(%d)", !iS
18d30 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  etting);.  sqlit
18d40 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d  e3_exec(db, zStm
18d50 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  t, 0, 0, 0);.}..
18d60 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
18d70 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
18d80 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  ck routine used 
18d90 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20  for dumping the 
18da0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63  database..** Eac
18db0 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62  h row received b
18dc0 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  y this callback 
18dd0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61  consists of a ta
18de0 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  ble name,.** the
18df0 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e   table type ("in
18e00 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29  dex" or "table")
18e10 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61   and SQL to crea
18e20 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  te the table..**
18e30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
18e40 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20  ould print text 
18e50 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65  sufficient to re
18e60 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
18e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18e80 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f  dump_callback(vo
18e90 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
18ea0 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
18eb0 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73  , char **azNotUs
18ec0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
18ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
18ee0 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
18ef0 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
18f00 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
18f10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
18f20 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41  (ShellState *)pA
18f30 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg;..  UNUSED_PA
18f40 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65  RAMETER(azNotUse
18f50 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  d);.  if( nArg!=
18f60 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20  3 || azArg==0 ) 
18f70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62  return 0;.  zTab
18f80 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
18f90 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31   zType = azArg[1
18fa0 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72  ];.  zSql = azAr
18fb0 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72  g[2];..  if( str
18fc0 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
18fd0 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
18fe0 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
18ff0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c  ntf(p->out, "DEL
19000 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
19010 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20  sequence;\n");. 
19020 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
19030 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
19040 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
19050 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  e)==0 ){.    raw
19060 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19070 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
19080 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
19090 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
190a0 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
190b0 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
190c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
190d0 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
190e0 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
190f0 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
19100 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
19110 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21  *zIns;.    if( !
19120 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
19130 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
19140 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
19150 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
19160 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20  chema=ON;\n");. 
19170 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
19180 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
19190 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c  }.    zIns = sql
191a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
191b0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
191c0 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28  O sqlite_master(
191d0 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
191e0 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29  me,rootpage,sql)
191f0 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53  ".       "VALUES
19200 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25  ('table','%q','%
19210 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20  q',0,'%q');",.  
19220 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61       zTable, zTa
19230 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ble, zSql);.    
19240 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
19250 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
19260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19270 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
19280 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
19290 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d  {.    printSchem
192a0 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53  aLine(p->out, zS
192b0 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a  ql, ";\n");.  }.
192c0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
192d0 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
192e0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
192f0 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
19300 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b  hellText sTable;
19310 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
19320 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  l;.    int i;.  
19330 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73    char *savedDes
19340 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  tTable;.    int 
19350 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20  savedMode;..    
19360 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c  azCol = tableCol
19370 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c  umnList(p, zTabl
19380 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  e);.    if( azCo
19390 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
193a0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
193b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
193c0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
193d0 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
193e0 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
193f0 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
19400 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
19410 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
19420 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
19430 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
19440 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69  " ... */.    ini
19450 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  tText(&sTable);.
19460 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
19470 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  sTable, zTable, 
19480 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
19490 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72  ));.    /* If pr
194a0 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77  eserving the row
194b0 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e  id, add a column
194c0 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20   list after the 
194d0 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20  table name..    
194e0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
194f0 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  s:  "INSERT INTO
19500 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63   tab(rowid,a,b,c
19510 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e  ,...) VALUES(...
19520 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61  )".    ** instea
19530 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22  d of the usual "
19540 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20  INSERT INTO tab 
19550 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20  VALUES(...)"..  
19560 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43    */.    if( azC
19570 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
19580 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
19590 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20  e, "(", 0);.    
195a0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
195b0 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  able, azCol[0], 
195c0 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
195d0 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
195e0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
195f0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
19600 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
19610 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
19620 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  le, azCol[i], qu
19630 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
19640 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
19650 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19660 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20  able, ")", 0);. 
19670 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69     }..    /* Bui
19680 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ld an appropriat
19690 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
196a0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  nt */.    initTe
196b0 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
196c0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
196d0 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22  elect, "SELECT "
196e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
196f0 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
19700 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19710 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ect, azCol[0], 0
19720 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
19730 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
19740 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
19750 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19760 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
19770 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19780 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ect, azCol[i], q
19790 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
197a0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
197b0 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  zCol[i+1] ){.   
197c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
197d0 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
197e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
197f0 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  .    freeColumnL
19800 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
19810 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19820 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30  ect, " FROM ", 0
19830 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19840 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62  t(&sSelect, zTab
19850 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
19860 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76  able));..    sav
19870 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d  edDestTable = p-
19880 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  >zDestTable;.   
19890 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e   savedMode = p->
198a0 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  mode;.    p->zDe
198b0 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65  stTable = sTable
198c0 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  .z;.    p->mode 
198d0 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  = p->cMode = MOD
198e0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  E_Insert;.    rc
198f0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c   = shell_exec(p,
19900 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
19910 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
19920 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )==SQLITE_CORRUP
19930 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  T ){.      raw_p
19940 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19950 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19960 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19970 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  \n");.      togg
19980 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
19990 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  >db);.      shel
199a0 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63  l_exec(p, sSelec
199b0 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 74  t.z, 0);.      t
199c0 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72  oggleSelectOrder
199d0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  (p->db);.    }. 
199e0 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
199f0 20 3d 20 73 61 76 65 64 44 65 73 74 54 61 62 6c   = savedDestTabl
19a00 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  e;.    p->mode =
19a10 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20   savedMode;.    
19a20 66 72 65 65 54 65 78 74 28 26 73 54 61 62 6c 65  freeText(&sTable
19a30 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  );.    freeText(
19a40 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69  &sSelect);.    i
19a50 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b  f( rc ) p->nErr+
19a60 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
19a70 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
19a80 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d  zQuery.  Use dum
19a90 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20  p_callback() as 
19aa0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
19ab0 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20  tine so that.** 
19ac0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19ad0 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f 75  the query are ou
19ae0 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61 74  tput as SQL stat
19af0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
19b00 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54 45   we get a SQLITE
19b10 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20  _CORRUPT error, 
19b20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79 20  rerun the query 
19b30 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a  after appending.
19b40 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  ** "ORDER BY row
19b50 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65 20  id DESC" to the 
19b60 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  end..*/.static i
19b70 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75  nt run_schema_du
19b80 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
19b90 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e  lState *p,.  con
19ba0 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a  st char *zQuery.
19bb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
19bc0 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
19bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
19be0 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  ec(p->db, zQuery
19bf0 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
19c00 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   p, &zErr);.  if
19c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
19c20 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72  RUPT ){.    char
19c30 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c   *zQ2;.    int l
19c40 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51  en = strlen30(zQ
19c50 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70  uery);.    raw_p
19c60 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19c70 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19c80 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19c90 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  \n");.    if( zE
19ca0 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
19cb0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19cc0 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a  "/****** %s ****
19cd0 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19ce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19cf0 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a  e(zErr);.      z
19d00 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Err = 0;.    }. 
19d10 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28     zQ2 = malloc(
19d20 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20   len+100 );.    
19d30 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74  if( zQ2==0 ) ret
19d40 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
19d50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e  te3_snprintf(len
19d60 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f  +100, zQ2, "%s O
19d70 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
19d80 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20  SC", zQuery);.  
19d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19da0 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20  xec(p->db, zQ2, 
19db0 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
19dc0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
19dd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
19de0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
19df0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52  , "/****** ERROR
19e00 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  : %s ******/\n",
19e10 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73   zErr);.    }els
19e20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19e30 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
19e40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
19e50 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
19e60 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20  free(zQ2);.  }. 
19e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e80 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68 65 6c  *.** Text of hel
19e90 70 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a 0a 2a  p messages..**.*
19ea0 2a 20 54 68 65 20 68 65 6c 70 20 74 65 78 74 20  * The help text 
19eb0 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64  for each individ
19ec0 75 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65 67 69  ual command begi
19ed0 6e 73 20 77 69 74 68 20 61 20 6c 69 6e 65 20 74  ns with a line t
19ee0 68 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77 69  hat starts.** wi
19ef0 74 68 20 22 2e 22 2e 20 20 53 75 62 73 65 71 75  th ".".  Subsequ
19f00 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 73 75  ent lines are su
19f10 70 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66 6f 72  pplimental infor
19f20 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
19f30 65 72 65 20 6d 75 73 74 20 62 65 20 74 77 6f 20  ere must be two 
19f40 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 62  or more spaces b
19f50 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
19f60 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 6e  f the command an
19f70 64 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f  d the.** start o
19f80 66 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  f the descriptio
19f90 6e 20 6f 66 20 77 68 61 74 20 74 68 61 74 20 63  n of what that c
19fa0 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a 2f 0a  ommand does..*/.
19fb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
19fc0 72 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20 3d 20  r *(azHelp[]) = 
19fd0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
19fe0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
19ff0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1a000 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a010 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69 76  ABLE).  ".archiv
1a020 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  e ...           
1a030 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63    Manage SQL arc
1a040 68 69 76 65 73 22 2c 0a 20 20 22 20 20 20 45 61  hives",.  "   Ea
1a050 63 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ch command must 
1a060 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
1a070 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a080 67 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  g options:",.  "
1a090 20 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74       -c, --creat
1a0a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a0b0 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63  Create a new arc
1a0c0 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d  hive",.  "     -
1a0d0 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20  u, --update     
1a0e0 20 20 20 20 20 20 20 20 20 20 41 64 64 20 6f 72            Add or
1a0f0 20 75 70 64 61 74 65 20 66 69 6c 65 73 20 77 69   update files wi
1a100 74 68 20 63 68 61 6e 67 65 64 20 6d 74 69 6d 65  th changed mtime
1a110 22 2c 0a 20 20 22 20 20 20 20 20 2d 69 2c 20 2d  ",.  "     -i, -
1a120 2d 69 6e 73 65 72 74 20 20 20 20 20 20 20 20 20  -insert         
1a130 20 20 20 20 20 20 4c 69 6b 65 20 2d 75 20 62 75        Like -u bu
1a140 74 20 61 6c 77 61 79 73 20 61 64 64 20 65 76 65  t always add eve
1a150 6e 20 69 66 20 75 6e 63 68 61 6e 67 65 64 22 2c  n if unchanged",
1a160 0a 20 20 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c  .  "     -t, --l
1a170 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1a180 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74      List content
1a190 73 20 6f 66 20 61 72 63 68 69 76 65 22 2c 0a 20  s of archive",. 
1a1a0 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74   "     -x, --ext
1a1b0 72 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ract            
1a1c0 20 20 45 78 74 72 61 63 74 20 66 69 6c 65 73 20    Extract files 
1a1d0 66 72 6f 6d 20 61 72 63 68 69 76 65 22 2c 0a 20  from archive",. 
1a1e0 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72   "   Optional ar
1a1f0 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20  guments:",.  "  
1a200 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65     -v, --verbose
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
1a220 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d  int each filenam
1a230 65 20 61 73 20 69 74 20 69 73 20 70 72 6f 63 65  e as it is proce
1a240 73 73 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d  ssed",.  "     -
1a250 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46  f FILE, --file F
1a260 49 4c 45 20 20 20 20 20 20 20 55 73 65 20 61 72  ILE       Use ar
1a270 63 68 69 76 65 20 46 49 4c 45 20 28 64 65 66 61  chive FILE (defa
1a280 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20 64  ult is current d
1a290 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d 61 20  b)",.  "     -a 
1a2a0 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64 20 46  FILE, --append F
1a2b0 49 4c 45 20 20 20 20 20 4f 70 65 6e 20 46 49 4c  ILE     Open FIL
1a2c0 45 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64  E using the apnd
1a2d0 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20  vfs VFS",.  "   
1a2e0 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65    -C DIR, --dire
1a2f0 63 74 6f 72 79 20 44 49 52 20 20 20 20 52 65 61  ctory DIR    Rea
1a300 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  d/extract files 
1a310 66 72 6f 6d 20 64 69 72 65 63 74 6f 72 79 20 44  from directory D
1a320 49 52 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c  IR",.  "     -n,
1a330 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20   --dryrun       
1a340 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
1a350 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20   SQL that would 
1a360 68 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a  have occurred",.
1a370 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22    "   Examples:"
1a380 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63  ,.  "     .ar -c
1a390 66 20 41 52 43 48 49 56 45 20 66 6f 6f 20 62 61  f ARCHIVE foo ba
1a3a0 72 20 20 23 20 43 72 65 61 74 65 20 41 52 43 48  r  # Create ARCH
1a3b0 49 56 45 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  IVE from files f
1a3c0 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22  oo and bar",.  "
1a3d0 20 20 20 20 20 2e 61 72 20 2d 74 66 20 41 52 43       .ar -tf ARC
1a3e0 48 49 56 45 20 20 20 20 20 20 20 20 20 20 23 20  HIVE          # 
1a3f0 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f 66 20  List members of 
1a400 41 52 43 48 49 56 45 22 2c 0a 20 20 22 20 20 20  ARCHIVE",.  "   
1a410 20 20 2e 61 72 20 2d 78 76 66 20 41 52 43 48 49    .ar -xvf ARCHI
1a420 56 45 20 20 20 20 20 20 20 20 20 23 20 56 65 72  VE         # Ver
1a430 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74 20 66  bosely extract f
1a440 69 6c 65 73 20 66 72 6f 6d 20 41 52 43 48 49 56  iles from ARCHIV
1a450 45 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c  E",.  "   See al
1a460 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68  so:",.  "      h
1a470 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
1a480 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f  /cli.html#sqlar_
1a490 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22  archive_support"
1a4a0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
1a4b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a4c0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
1a4d0 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
1a4e0 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68         Show auth
1a4f0 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73  orizer callbacks
1a500 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  ",.#endif.  ".ba
1a510 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
1a520 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
1a530 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
1a540 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ") to FILE",.  "
1a550 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20         --append 
1a560 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1a570 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20  he appendvfs",. 
1a580 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63   "       --async
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1a5a0 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f  te to FILE witho
1a5b0 75 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  ut journal and f
1a5c0 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61 69  sync()",.  ".bai
1a5d0 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
1a5e0 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
1a5f0 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
1a600 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c  .  Default OFF",
1a610 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  .  ".binary on|o
1a620 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75 72  ff           Tur
1a630 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
1a640 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
1a650 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63 64  ult OFF",.  ".cd
1a660 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
1a670 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65        Change the
1a680 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
1a690 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 22  ry to DIRECTORY"
1a6a0 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ,.  ".changes on
1a6b0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53 68  |off          Sh
1a6c0 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ow number of row
1a6d0 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c  s changed by SQL
1a6e0 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f  ",.  ".check GLO
1a6f0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  B              F
1a700 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69  ail if output si
1a710 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f  nce .testcase do
1a720 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a 20  es not match",. 
1a730 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20   ".clone NEWDB  
1a740 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e 65             Clone
1a750 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44 42   data into NEWDB
1a760 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69   from the existi
1a770 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
1a780 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20 20  ".databases     
1a790 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e            List n
1a7a0 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20 6f  ames and files o
1a7b0 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
1a7c0 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f 6e  ases",.  ".dbcon
1a7d0 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20 20  fig ?op? ?val?  
1a7e0 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e 67     List or chang
1a7f0 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  e sqlite3_db_con
1a800 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c 0a  fig() options",.
1a810 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
1a820 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1a830 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
1a840 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
1a850 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75 6d  tabase",.  ".dum
1a860 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
1a870 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c 20       Render all 
1a880 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
1a890 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20 20   as SQL",.  "   
1a8a0 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1a8b0 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f     --preserve-ro
1a8c0 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75 64  wids      Includ
1a8d0 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20 69  e ROWID values i
1a8e0 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a 20  n the output",. 
1a8f0 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e 65   "     --newline
1a900 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41 6c  s             Al
1a910 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e 65  low unescaped ne
1a920 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72 73  wline characters
1a930 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20 22   in output",.  "
1a940 20 20 20 54 41 42 4c 45 20 69 73 20 61 20 4c 49     TABLE is a LI
1a950 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74  KE pattern for t
1a960 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75 6d  he tables to dum
1a970 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c  p",.  ".echo on|
1a980 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
1a990 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68  Turn command ech
1a9a0 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  o on or off",.  
1a9b0 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c  ".eqp on|off|ful
1a9c0 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c 65  l|...     Enable
1a9d0 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f   or disable auto
1a9e0 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55  matic EXPLAIN QU
1a9f0 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20 20  ERY PLAN",.  "  
1aa00 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c 0a   Other Modes:",.
1aa10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1aa20 42 55 47 0a 20 20 22 20 20 20 20 20 20 74 65 73  BUG.  "      tes
1aa30 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1aa40 20 20 20 53 68 6f 77 20 72 61 77 20 45 58 50 4c     Show raw EXPL
1aa50 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f  AIN QUERY PLAN o
1aa60 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20  utput",.  "     
1aa70 20 74 72 61 63 65 20 20 20 20 20 20 20 20 20 20   trace          
1aa80 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75         Like \"fu
1aa90 6c 6c 5c 22 20 62 75 74 20 65 6e 61 62 6c 65 20  ll\" but enable 
1aaa0 5c 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72  \"PRAGMA vdbe_tr
1aab0 61 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a 20  ace\"",.#endif. 
1aac0 20 22 20 20 20 20 20 20 74 72 69 67 67 65 72 20   "      trigger 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1aae0 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20  ke \"full\" but 
1aaf0 61 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67 65  also show trigge
1ab00 72 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20 22  r bytecode",.  "
1ab10 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20  .excel          
1ab20 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79           Display
1ab30 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e   the output of n
1ab40 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 73  ext command in s
1ab50 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22  preadsheet",.  "
1ab60 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20 20 20 20  .exit ?CODE?    
1ab70 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
1ab80 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20  is program with 
1ab90 72 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f 44 45  return-code CODE
1aba0 22 2c 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20  ",.  ".expert   
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1abc0 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67  XPERIMENTAL. Sug
1abd0 67 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72  gest indexes for
1abe0 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65   queries",./* Be
1abf0 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f  cause explain mo
1ac00 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f  de comes on auto
1ac10 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74  matically now, t
1ac20 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  he ".explain" mo
1ac30 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64  de.** is removed
1ac40 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73   from the help s
1ac50 63 72 65 65 6e 2e 20 49 74 20 69 73 20 73 74 69  creen. It is sti
1ac60 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ll supported for
1ac70 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72   legacy, however
1ac80 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20   */./*".explain 
1ac90 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20  ?on|off|auto?   
1aca0 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
1acb0 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
1acc0 66 66 22 2c 2a 2f 0a 20 20 22 2e 66 69 6c 65 63  ff",*/.  ".filec
1acd0 74 72 6c 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20  trl CMD ...     
1ace0 20 20 20 52 75 6e 20 76 61 72 69 6f 75 73 20 73     Run various s
1acf0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1ad00 72 6f 6c 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  rol() operations
1ad10 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  ",.  "          
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 52 75 6e 20 5c 22 2e 66 69 6c 65 63 74 72 6c   Run \".filectrl
1ad40 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  \" with no argum
1ad50 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73  ents for details
1ad60 22 2c 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d  ",.  ".fullschem
1ad70 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20 20 53  a ?--indent?   S
1ad80 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74  how schema and t
1ad90 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71  he content of sq
1ada0 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73  lite_stat tables
1adb0 22 2c 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f  ",.  ".headers o
1adc0 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54  n|off          T
1add0 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68  urn display of h
1ade0 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66  eaders on or off
1adf0 22 2c 0a 20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c  ",.  ".help ?-al
1ae00 6c 3f 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 53  l? ?PATTERN?   S
1ae10 68 6f 77 20 68 65 6c 70 20 74 65 78 74 20 66 6f  how help text fo
1ae20 72 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 2e  r PATTERN",.  ".
1ae30 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
1ae40 45 20 20 20 20 20 20 20 49 6d 70 6f 72 74 20 64  E       Import d
1ae50 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
1ae60 74 6f 20 54 41 42 4c 45 22 2c 0a 23 69 66 6e 64  to TABLE",.#ifnd
1ae70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1ae80 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e  EST_CONTROL.  ".
1ae90 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54  imposter INDEX T
1aea0 41 42 4c 45 20 20 20 20 43 72 65 61 74 65 20 69  ABLE    Create i
1aeb0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41  mposter table TA
1aec0 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44  BLE on index IND
1aed0 45 58 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  EX",.#endif.  ".
1aee0 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20  indexes ?TABLE? 
1aef0 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d          Show nam
1af00 65 73 20 6f 66 20 69 6e 64 65 78 65 73 22 2c 0a  es of indexes",.
1af10 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
1af30 20 54 41 42 4c 45 20 69 73 20 73 70 65 63 69 66   TABLE is specif
1af40 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69  ied, only show i
1af50 6e 64 65 78 65 73 20 66 6f 72 22 2c 0a 20 20 22  ndexes for",.  "
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1af80 73 20 6d 61 74 63 68 69 6e 67 20 54 41 42 4c 45  s matching TABLE
1af90 20 75 73 69 6e 67 20 74 68 65 20 4c 49 4b 45 20   using the LIKE 
1afa0 6f 70 65 72 61 74 6f 72 2e 22 2c 0a 23 69 66 64  operator.",.#ifd
1afb0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1afc0 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74  _IOTRACE.  ".iot
1afd0 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20 20  race FILE       
1afe0 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20       Enable I/O 
1aff0 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69  diagnostic loggi
1b000 6e 67 20 74 6f 20 46 49 4c 45 22 2c 0a 23 65 6e  ng to FILE",.#en
1b010 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c  dif.  ".limit ?L
1b020 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 20 20  IMIT? ?VAL?     
1b030 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67  Display or chang
1b040 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
1b050 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 22 2c  n SQLITE_LIMIT",
1b060 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e  .  ".lint OPTION
1b070 53 20 20 20 20 20 20 20 20 20 20 20 20 52 65 70  S            Rep
1b080 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63  ort potential sc
1b090 68 65 6d 61 20 69 73 73 75 65 73 2e 22 2c 0a 20  hema issues.",. 
1b0a0 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22   "     Options:"
1b0b0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 66 6b 65  ,.  "        fke
1b0c0 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20 46 69  y-indexes     Fi
1b0d0 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69  nd missing forei
1b0e0 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73 22 2c  gn key indexes",
1b0f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b100 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1b110 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c  ION.  ".load FIL
1b120 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 20 20  E ?ENTRY?       
1b130 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f  Load an extensio
1b140 6e 20 6c 69 62 72 61 72 79 22 2c 0a 23 65 6e 64  n library",.#end
1b150 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c  if.  ".log FILE|
1b160 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 54  off            T
1b170 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f  urn logging on o
1b180 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e  r off.  FILE can
1b190 20 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75   be stderr/stdou
1b1a0 74 22 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44  t",.  ".mode MOD
1b1b0 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  E ?TABLE?       
1b1c0 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 22  Set output mode"
1b1d0 2c 0a 20 20 22 20 20 20 4d 4f 44 45 20 69 73 20  ,.  "   MODE is 
1b1e0 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 22 20 20 20  one of:",.  "   
1b1f0 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d    ascii    Colum
1b200 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65  ns/rows delimite
1b210 64 20 62 79 20 30 78 31 46 20 61 6e 64 20 30 78  d by 0x1F and 0x
1b220 31 45 22 2c 0a 20 20 22 20 20 20 20 20 63 73 76  1E",.  "     csv
1b230 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61        Comma-sepa
1b240 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20  rated values",. 
1b250 20 22 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20   "     column   
1b260 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c  Left-aligned col
1b270 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64  umns.  (See .wid
1b280 74 68 29 22 2c 0a 20 20 22 20 20 20 20 20 68 74  th)",.  "     ht
1b290 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62  ml     HTML <tab
1b2a0 6c 65 3e 20 63 6f 64 65 22 2c 0a 20 20 22 20 20  le> code",.  "  
1b2b0 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20     insert   SQL 
1b2c0 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  insert statement
1b2d0 73 20 66 6f 72 20 54 41 42 4c 45 22 2c 0a 20 20  s for TABLE",.  
1b2e0 22 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f  "     line     O
1b2f0 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
1b300 65 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74  e",.  "     list
1b310 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69       Values deli
1b320 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22 22 2c  mited by \"|\"",
1b330 0a 20 20 22 20 20 20 20 20 71 75 6f 74 65 20 20  .  "     quote  
1b340 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72 73    Escape answers
1b350 20 61 73 20 66 6f 72 20 53 51 4c 22 2c 0a 20 20   as for SQL",.  
1b360 22 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54  "     tabs     T
1b370 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ab-separated val
1b380 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 74 63  ues",.  "     tc
1b390 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20  l      TCL list 
1b3a0 65 6c 65 6d 65 6e 74 73 22 2c 0a 20 20 22 2e 6e  elements",.  ".n
1b3b0 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20  ullvalue STRING 
1b3c0 20 20 20 20 20 20 20 55 73 65 20 53 54 52 49 4e         Use STRIN
1b3d0 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55  G in place of NU
1b3e0 4c 4c 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 2e  LL values",.  ".
1b3f0 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45  once (-e|-x|FILE
1b400 29 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 66  )       Output f
1b410 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  or the next SQL 
1b420 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20  command only to 
1b430 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 49  FILE",.  "     I
1b440 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69  f FILE begins wi
1b450 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e  th '|' then open
1b460 20 61 73 20 61 20 70 69 70 65 22 2c 0a 20 20 22   as a pipe",.  "
1b470 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74 69 6f       Other optio
1b480 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
1b490 2d 65 20 20 20 20 49 6e 76 6f 6b 65 20 73 79 73  -e    Invoke sys
1b4a0 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f 72 22  tem text editor"
1b4b0 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 78 20 20  ,.  "       -x  
1b4c0 20 20 4f 70 65 6e 20 69 6e 20 61 20 73 70 72 65    Open in a spre
1b4d0 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e 6f 70  adsheet",.  ".op
1b4e0 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49  en ?OPTIONS? ?FI
1b4f0 4c 45 3f 20 20 20 43 6c 6f 73 65 20 65 78 69 73  LE?   Close exis
1b500 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e  ting database an
1b510 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 22 2c 0a  d reopen FILE",.
1b520 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a    "     Options:
1b530 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1b540 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 55 73  append        Us
1b550 65 20 61 70 70 65 6e 64 76 66 73 20 74 6f 20 61  e appendvfs to a
1b560 70 70 65 6e 64 20 64 61 74 61 62 61 73 65 20 74  ppend database t
1b570 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 46 49 4c  o the end of FIL
1b580 45 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E",.#ifdef SQLIT
1b590 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
1b5a0 4c 49 5a 45 0a 20 20 22 20 20 20 20 20 20 20 20  LIZE.  "        
1b5b0 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 20 20 20  --deserialize   
1b5c0 4c 6f 61 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  Load into memory
1b5d0 20 75 73 65 69 6e 67 20 73 71 6c 69 74 65 33 5f   useing sqlite3_
1b5e0 64 65 73 65 72 69 61 6c 69 7a 65 28 29 22 2c 0a  deserialize()",.
1b5f0 20 20 22 20 20 20 20 20 20 20 20 2d 2d 68 65 78    "        --hex
1b600 64 62 20 20 20 20 20 20 20 20 20 4c 6f 61 64 20  db         Load 
1b610 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 5c 22  the output of \"
1b620 64 62 74 6f 74 78 74 5c 22 20 61 73 20 61 6e 20  dbtotxt\" as an 
1b630 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 22 2c 0a 20  in-memory db",. 
1b640 20 22 20 20 20 20 20 20 20 20 2d 2d 6d 61 78 73   "        --maxs
1b650 69 7a 65 20 4e 20 20 20 20 20 4d 61 78 69 6d 75  ize N     Maximu
1b660 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78  m size for --hex
1b670 64 62 20 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c  db or --deserial
1b680 69 7a 65 64 20 64 61 74 61 62 61 73 65 22 2c 0a  ized database",.
1b690 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20  #endif.  "      
1b6a0 20 20 2d 2d 6e 65 77 20 20 20 20 20 20 20 20 20    --new         
1b6b0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c    Initialize FIL
1b6c0 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 64 61  E to an empty da
1b6d0 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20  tabase",.  "    
1b6e0 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20      --readonly  
1b6f0 20 20 20 20 4f 70 65 6e 20 46 49 4c 45 20 72 65      Open FILE re
1b700 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20  adonly",.  "    
1b710 20 20 20 20 2d 2d 7a 69 70 20 20 20 20 20 20 20      --zip       
1b720 20 20 20 20 46 49 4c 45 20 69 73 20 61 20 5a 49      FILE is a ZI
1b730 50 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 2e  P archive",.  ".
1b740 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20  output ?FILE?   
1b750 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1b760 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72 20 73  put to FILE or s
1b770 74 64 6f 75 74 20 69 66 20 46 49 4c 45 20 69 73  tdout if FILE is
1b780 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20 22 20 20   omitted",.  "  
1b790 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1b7a0 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1b7b0 6f 70 65 6e 20 69 74 20 61 73 20 61 20 70 69 70  open it as a pip
1b7c0 65 2e 22 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74  e.",.  ".paramet
1b7d0 65 72 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20  er CMD ...      
1b7e0 20 4d 61 6e 61 67 65 20 53 51 4c 20 70 61 72 61   Manage SQL para
1b7f0 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c  meter bindings",
1b800 0a 20 20 22 20 20 20 63 6c 65 61 72 20 20 20 20  .  "   clear    
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1b820 72 61 73 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67  rase all binding
1b830 73 22 2c 0a 20 20 22 20 20 20 69 6e 69 74 20 20  s",.  "   init  
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
1b860 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74   TEMP table that
1b870 20 68 6f 6c 64 73 20 62 69 6e 64 69 6e 67 73 22   holds bindings"
1b880 2c 0a 20 20 22 20 20 20 6c 69 73 74 20 20 20 20  ,.  "   list    
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 4c 69 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  List the current
1b8b0 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69   parameter bindi
1b8c0 6e 67 73 22 2c 0a 20 20 22 20 20 20 73 65 74 20  ngs",.  "   set 
1b8d0 50 41 52 41 4d 45 54 45 52 20 56 41 4c 55 45 20  PARAMETER VALUE 
1b8e0 20 20 20 20 47 69 76 65 6e 20 53 51 4c 20 70 61      Given SQL pa
1b8f0 72 61 6d 65 74 65 72 20 50 41 52 41 4d 45 54 45  rameter PARAMETE
1b900 52 20 61 20 76 61 6c 75 65 20 6f 66 20 56 41 4c  R a value of VAL
1b910 55 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  UE",.  "        
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 50 41 52 41 4d 45 54 45 52 20 73 68 6f     PARAMETER sho
1b940 75 6c 64 20 73 74 61 72 74 20 77 69 74 68 20 6f  uld start with o
1b950 6e 65 20 6f 66 3a 20 24 20 3a 20 40 20 3f 22 2c  ne of: $ : @ ?",
1b960 0a 20 20 22 20 20 20 75 6e 73 65 74 20 50 41 52  .  "   unset PAR
1b970 41 4d 45 54 45 52 20 20 20 20 20 20 20 20 20 52  AMETER         R
1b980 65 6d 6f 76 65 20 50 41 52 41 4d 45 54 45 52 20  emove PARAMETER 
1b990 66 72 6f 6d 20 74 68 65 20 62 69 6e 64 69 6e 67  from the binding
1b9a0 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e 70 72 69   table",.  ".pri
1b9b0 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
1b9c0 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72       Print liter
1b9d0 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23 69 66 6e  al STRING",.#ifn
1b9e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b9f0 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
1ba00 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73 73 20 4e  K.  ".progress N
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1ba20 76 6f 6b 65 20 70 72 6f 67 72 65 73 73 20 68 61  voke progress ha
1ba30 6e 64 6c 65 72 20 61 66 74 65 72 20 65 76 65 72  ndler after ever
1ba40 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c 0a 20 20  y N opcodes",.  
1ba50 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e 20 20 20  "   --limit N   
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1ba70 74 65 72 72 75 70 74 20 61 66 74 65 72 20 4e 20  terrupt after N 
1ba80 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1ba90 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6f 6e 63  ks",.  "   --onc
1baa0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1bab0 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20       Do no more 
1bac0 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67 72 65 73  than one progres
1bad0 73 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20  s interrupt",.  
1bae0 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d 71 20 20  "   --quiet|-q  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
1bb00 20 6f 75 74 70 75 74 20 65 78 63 65 70 74 20 61   output except a
1bb10 74 20 69 6e 74 65 72 72 75 70 74 73 22 2c 0a 20  t interrupts",. 
1bb20 20 22 20 20 20 2d 2d 72 65 73 65 74 20 20 20 20   "   --reset    
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1bb40 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 66  eset the count f
1bb50 6f 72 20 65 61 63 68 20 69 6e 70 75 74 20 61 6e  or each input an
1bb60 64 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 23 65  d interrupt",.#e
1bb70 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d 70 74 20  ndif.  ".prompt 
1bb80 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20  MAIN CONTINUE   
1bb90 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
1bba0 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a  ndard prompts",.
1bbb0 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1bbd0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a   this program",.
1bbe0 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20    ".read FILE   
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61 64              Read
1bc00 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45   input from FILE
1bc10 22 2c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ",.#if !defined(
1bc20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1bc30 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
1bc40 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1bc50 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a  LE_DBPAGE_VTAB).
1bc60 20 20 22 2e 72 65 63 6f 76 65 72 20 20 20 20 20    ".recover     
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 52 65 63 6f              Reco
1bc80 76 65 72 20 61 73 20 6d 75 63 68 20 64 61 74 61  ver as much data
1bc90 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
1bca0 6d 20 63 6f 72 72 75 70 74 20 64 62 2e 22 2c 0a  m corrupt db.",.
1bcb0 20 20 22 20 20 20 2d 2d 66 72 65 65 6c 69 73 74    "   --freelist
1bcc0 2d 63 6f 72 72 75 70 74 20 20 20 20 20 20 20 41  -corrupt       A
1bcd0 73 73 75 6d 65 20 74 68 65 20 66 72 65 65 6c 69  ssume the freeli
1bce0 73 74 20 69 73 20 63 6f 72 72 75 70 74 22 2c 0a  st is corrupt",.
1bcf0 20 20 22 20 20 20 2d 2d 72 65 63 6f 76 65 72 79    "   --recovery
1bd00 2d 64 62 20 4e 41 4d 45 20 20 20 20 20 20 20 53  -db NAME       S
1bd10 74 6f 72 65 20 72 65 63 6f 76 65 72 79 20 6d 65  tore recovery me
1bd20 74 61 64 61 74 61 20 69 6e 20 64 61 74 61 62 61  tadata in databa
1bd30 73 65 20 66 69 6c 65 20 4e 41 4d 45 22 2c 0a 20  se file NAME",. 
1bd40 20 22 20 20 20 2d 2d 6c 6f 73 74 2d 61 6e 64 2d   "   --lost-and-
1bd50 66 6f 75 6e 64 20 54 41 42 4c 45 20 20 20 41 6c  found TABLE   Al
1bd60 74 65 72 6e 61 74 69 76 65 20 6e 61 6d 65 20 66  ternative name f
1bd70 6f 72 20 74 68 65 20 6c 6f 73 74 2d 61 6e 64 2d  or the lost-and-
1bd80 66 6f 75 6e 64 20 74 61 62 6c 65 22 2c 0a 20 20  found table",.  
1bd90 22 20 20 20 2d 2d 6e 6f 2d 72 6f 77 69 64 73 20  "   --no-rowids 
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f 20               Do 
1bdb0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
1bdc0 65 63 6f 76 65 72 20 72 6f 77 69 64 20 76 61 6c  ecover rowid val
1bdd0 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ues",.  "       
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 74 68 61 74 20 61 72 65 20 6e 6f       that are no
1be00 74 20 61 6c 73 6f 20 49 4e 54 45 47 45 52 20 50  t also INTEGER P
1be10 52 49 4d 41 52 59 20 4b 45 59 73 22 2c 0a 23 65  RIMARY KEYs",.#e
1be20 6e 64 69 66 0a 20 20 22 2e 72 65 73 74 6f 72 65  ndif.  ".restore
1be30 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
1be40 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
1be50 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
1be60 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
1be70 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46  ILE",.  ".save F
1be80 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1be90 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72    Write in-memor
1bea0 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  y database into 
1beb0 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73  FILE",.  ".scans
1bec0 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  tats on|off     
1bed0 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f     Turn sqlite3_
1bee0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
1bef0 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20  ) metrics on or 
1bf00 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61  off",.  ".schema
1bf10 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20   ?PATTERN?      
1bf20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
1bf30 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74  E statements mat
1bf40 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a  ching PATTERN",.
1bf50 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a    "     Options:
1bf60 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d  ",.  "         -
1bf70 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20  -indent         
1bf80 20 20 20 54 72 79 20 74 6f 20 70 72 65 74 74 79     Try to pretty
1bf90 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d  -print the schem
1bfa0 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74  a",.  ".selftest
1bfb0 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20   ?OPTIONS?      
1bfc0 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65  Run tests define
1bfd0 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53  d in the SELFTES
1bfe0 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  T table",.  "   
1bff0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1c000 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20        --init    
1c010 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74             Creat
1c020 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54  e a new SELFTEST
1c030 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1c040 20 20 20 2d 76 20 20 20 20 20 20 20 20 20 20 20     -v           
1c050 20 20 20 20 20 20 20 20 56 65 72 62 6f 73 65 20          Verbose 
1c060 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70  output",.  ".sep
1c070 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
1c080 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
1c090 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73  column and row s
1c0a0 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20  eparators",.#if 
1c0b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c0c0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
1c0d0 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45   ".session ?NAME
1c0e0 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74  ? CMD ...  Creat
1c0f0 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
1c100 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75  sions",.  "   Su
1c110 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22  bcommands:",.  "
1c120 20 20 20 20 20 61 74 74 61 63 68 20 54 41 42 4c       attach TABL
1c130 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74  E             At
1c140 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22  tach TABLE",.  "
1c150 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 46       changeset F
1c160 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72  ILE           Wr
1c170 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
1c180 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1c190 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20      close       
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1c1b0 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c  se one session",
1c1c0 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20  .  "     enable 
1c1d0 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
1c1e0 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74    Set or query t
1c1f0 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a  he enable bit",.
1c200 20 20 22 20 20 20 20 20 66 69 6c 74 65 72 20 47    "     filter G
1c210 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  LOB...          
1c220 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d   Reject tables m
1c230 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a  atching GLOBs",.
1c240 20 20 22 20 20 20 20 20 69 6e 64 69 72 65 63 74    "     indirect
1c250 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1c260 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74   Mark or query t
1c270 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74  he indirect stat
1c280 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65  us",.  "     ise
1c290 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20  mpty            
1c2a0 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74        Query whet
1c2b0 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20  her the session 
1c2c0 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20  is empty",.  "  
1c2d0 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1c2f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
1c300 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a  session names",.
1c310 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20    "     open DB 
1c320 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
1c330 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
1c340 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20  ion on DB",.  " 
1c350 20 20 20 20 70 61 74 63 68 73 65 74 20 46 49 4c      patchset FIL
1c360 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69  E            Wri
1c370 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69 6e  te a patchset in
1c380 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1c390 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69  If ?NAME? is omi
1c3a0 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20  tted, the first 
1c3b0 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20  defined session 
1c3c0 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69  is used.",.#endi
1c3d0 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e  f.  ".sha3sum ..
1c3e0 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  .             Co
1c3f0 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73  mpute a SHA3 has
1c400 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  h of database co
1c410 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f  ntent",.  "    O
1c420 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1c430 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20     --schema     
1c440 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61           Also ha
1c450 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  sh the sqlite_ma
1c460 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22  ster table",.  "
1c470 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34        --sha3-224
1c480 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1c490 74 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67  the sha3-224 alg
1c4a0 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1c4b0 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20    --sha3-256    
1c4c0 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c4d0 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74  sha3-256 algorit
1c4e0 68 6d 20 28 64 65 66 61 75 6c 74 29 22 2c 0a 20  hm (default)",. 
1c4f0 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33   "      --sha3-3
1c500 38 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73  84            Us
1c510 65 20 74 68 65 20 73 68 61 33 2d 33 38 34 20 61  e the sha3-384 a
1c520 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20  lgorithm",.  "  
1c530 20 20 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20      --sha3-512  
1c540 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1c550 65 20 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72  e sha3-512 algor
1c560 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e  ithm",.  "    An
1c570 79 20 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74  y other argument
1c580 20 69 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65   is a LIKE patte
1c590 72 6e 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  rn for tables to
1c5a0 20 68 61 73 68 22 2c 0a 23 69 66 20 21 64 65 66   hash",.#if !def
1c5b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c5c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
1c5d0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1c5e0 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
1c5f0 54 41 42 29 0a 20 20 22 2e 73 68 61 72 65 64 2d  TAB).  ".shared-
1c600 73 63 68 65 6d 61 20 43 4d 44 20 44 42 31 20 44  schema CMD DB1 D
1c610 42 32 20 2e 2e 2e 22 2c 0a 20 20 22 20 20 20 20  B2 ...",.  "    
1c620 43 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20  Commands:",.  " 
1c630 20 20 20 20 20 20 63 68 65 63 6b 20 20 20 20 20        check     
1c640 20 20 20 20 20 20 20 20 20 20 20 44 65 74 65 72             Deter
1c650 6d 69 6e 65 20 69 66 20 44 42 31 2c 20 44 42 32  mine if DB1, DB2
1c660 2c 20 65 74 63 20 68 61 76 65 20 69 64 65 6e 74  , etc have ident
1c670 69 63 61 6c 20 73 63 68 65 6d 61 73 22 2c 0a 20  ical schemas",. 
1c680 20 22 20 20 20 20 20 20 20 66 69 78 20 20 20 20   "       fix    
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74                At
1c6a0 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 20 44 42  tempt to make DB
1c6b0 31 2c 20 44 42 32 2c 20 65 74 63 20 63 6f 6d 70  1, DB2, etc comp
1c6c0 61 74 69 62 6c 65 22 2c 0a 23 65 6e 64 69 66 0a  atible",.#endif.
1c6d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1c6e0 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1c6f0 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e  .shell CMD ARGS.
1c700 2e 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ..       Run CMD
1c710 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1c720 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1c730 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  dif.  ".show    
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  Show the current
1c760 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69   values for vari
1c770 6f 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a 20  ous settings",. 
1c780 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66   ".stats ?on|off
1c790 3f 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20  ?          Show 
1c7a0 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74  stats or turn st
1c7b0 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ats on or off",.
1c7c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1c7d0 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1c7e0 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53  .system CMD ARGS
1c7f0 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ...      Run CMD
1c800 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1c810 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1c820 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f  dif.  ".tables ?
1c830 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 20  TABLE?          
1c840 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
1c850 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c 49  bles matching LI
1c860 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
1c870 22 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20  ",.  ".testcase 
1c880 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 42  NAME           B
1c890 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67  egin redirecting
1c8a0 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74   output to 'test
1c8b0 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a  case-out.txt'",.
1c8c0 20 20 22 2e 74 65 73 74 63 74 72 6c 20 43 4d 44    ".testctrl CMD
1c8d0 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 75 6e 20   ...        Run 
1c8e0 76 61 72 69 6f 75 73 20 73 71 6c 69 74 65 33 5f  various sqlite3_
1c8f0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 6f  test_control() o
1c900 70 65 72 61 74 69 6f 6e 73 22 2c 0a 20 20 22 20  perations",.  " 
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 20 20 20 20 52 75 6e 20 5c 22            Run \"
1c930 2e 74 65 73 74 63 74 72 6c 5c 22 20 77 69 74 68  .testctrl\" with
1c940 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
1c950 72 20 64 65 74 61 69 6c 73 22 2c 0a 20 20 22 2e  r details",.  ".
1c960 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20  timeout MS      
1c970 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e          Try open
1c980 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65  ing locked table
1c990 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65  s for MS millise
1c9a0 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65  conds",.  ".time
1c9b0 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
1c9c0 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d      Turn SQL tim
1c9d0 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23  er on or off",.#
1c9e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c9f0 49 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61  IT_TRACE.  ".tra
1ca00 63 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  ce ?OPTIONS?    
1ca10 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68       Output each
1ca20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
1ca30 73 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20  s it is run",.  
1ca40 22 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20  "    FILE       
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1ca60 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45  d output to FILE
1ca70 22 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74  ",.  "    stdout
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1caa0 20 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20   stdout",.  "   
1cab0 20 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20   stderr         
1cac0 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1cad0 74 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c  tput to stderr",
1cae0 0a 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20  .  "    off     
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 44 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22  Disable tracing"
1cb10 2c 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e  ,.  "    --expan
1cb20 64 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ded             
1cb30 20 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61   Expand query pa
1cb40 72 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65  rameters",.#ifde
1cb50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1cb60 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20  NORMALIZE.  "   
1cb70 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20   --normalized   
1cb80 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20           Normal 
1cb90 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1cba0 74 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20  ts",.#endif.  " 
1cbb0 20 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20     --plain      
1cbc0 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1cbd0 53 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70  SQL as it is inp
1cbe0 75 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74  ut",.  "    --st
1cbf0 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mt              
1cc00 20 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d      Trace statem
1cc10 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53  ent execution (S
1cc20 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
1cc30 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f  )",.  "    --pro
1cc40 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  file            
1cc50 20 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65     Profile state
1cc60 6d 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52  ments (SQLITE_TR
1cc70 41 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20  ACE_PROFILE)",. 
1cc80 20 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20   "    --row     
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1cca0 61 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51  ace each row (SQ
1ccb0 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22  LITE_TRACE_ROW)"
1ccc0 2c 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65  ,.  "    --close
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f   Trace connectio
1ccf0 6e 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f  n close (SQLITE_
1cd00 54 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23  TRACE_CLOSE)",.#
1cd10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1cd20 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 23 69  OMIT_TRACE */.#i
1cd30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cd40 47 0a 20 20 22 2e 75 6e 6d 6f 64 75 6c 65 20 4e  G.  ".unmodule N
1cd50 41 4d 45 20 2e 2e 2e 20 20 20 20 20 20 20 55 6e  AME ...       Un
1cd60 72 65 67 69 73 74 65 72 20 76 69 72 74 75 61 6c  register virtual
1cd70 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 73 22 2c   table modules",
1cd80 0a 20 20 22 20 20 20 20 2d 2d 61 6c 6c 65 78 63  .  "    --allexc
1cd90 65 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ept             
1cda0 55 6e 72 65 67 69 73 74 65 72 20 65 76 65 72 79  Unregister every
1cdb0 74 68 69 6e 67 20 65 78 63 65 70 74 20 74 68 6f  thing except tho
1cdc0 73 65 20 6e 61 6d 65 64 22 2c 0a 23 65 6e 64 69  se named",.#endi
1cdd0 66 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  f.  ".vfsinfo ?A
1cde0 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 49 6e  UX?           In
1cdf0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1ce00 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46  the top-level VF
1ce10 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69 73 74 20  S",.  ".vfslist 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
1ce40 6c 65 20 56 46 53 65 73 22 2c 0a 20 20 22 2e 76  le VFSes",.  ".v
1ce50 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20  fsname ?AUX?    
1ce60 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65         Print the
1ce70 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
1ce80 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64   stack",.  ".wid
1ce90 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
1cea0 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20       Set column 
1ceb0 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c  widths for \"col
1cec0 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22  umn\" mode",.  "
1ced0 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
1cee0 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
1cef0 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  fy",.};../*.** O
1cf00 75 74 70 75 74 20 68 65 6c 70 20 74 65 78 74 2e  utput help text.
1cf10 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20  .**.** zPattern 
1cf20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 65  describes the se
1cf30 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f  t of commands fo
1cf40 72 20 77 68 69 63 68 20 68 65 6c 70 20 74 65 78  r which help tex
1cf50 74 20 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a  t is provided..*
1cf60 2a 20 49 66 20 7a 50 61 74 74 65 72 6e 20 69 73  * If zPattern is
1cf70 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77   NULL, then show
1cf80 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1cf90 75 74 20 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f  ut only give a o
1cfa0 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72  ne-line.** descr
1cfb0 69 70 74 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a  iption of each..
1cfc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1cfd0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
1cfe0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1cff0 74 20 73 68 6f 77 48 65 6c 70 28 46 49 4c 45 20  t showHelp(FILE 
1d000 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
1d010 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a 20 20 69   *zPattern){.  i
1d020 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1d030 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  j = 0;.  int n =
1d040 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   0;.  char *zPat
1d050 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
1d060 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65  ==0.   || zPatte
1d070 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c  rn[0]=='0'.   ||
1d080 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e   strcmp(zPattern
1d090 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20  ,"-a")==0.   || 
1d0a0 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c  strcmp(zPattern,
1d0b0 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a  "-all")==0.  ){.
1d0c0 20 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20      /* Show all 
1d0d0 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1d0e0 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20  ly one line per 
1d0f0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
1d100 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29  f( zPattern==0 )
1d110 20 7a 50 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a   zPattern = "";.
1d120 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1d130 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1d140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1d150 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d  ( azHelp[i][0]==
1d160 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b  '.' || zPattern[
1d170 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  0] ){.        ut
1d180 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1d190 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d  %s\n", azHelp[i]
1d1a0 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  );.        n++;.
1d1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f  }else{.    /* Lo
1d1d0 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20  ok for commands 
1d1e0 74 68 61 74 20 66 6f 72 20 77 68 69 63 68 20 7a  that for which z
1d1f0 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 65 78  Pattern is an ex
1d200 61 63 74 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  act prefix */.  
1d210 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33    zPat = sqlite3
1d220 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c  _mprintf(".%s*",
1d230 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20   zPattern);.    
1d240 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1d250 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b  Size(azHelp); i+
1d260 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1d270 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50  lite3_strglob(zP
1d280 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d  at, azHelp[i])==
1d290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
1d2a0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1d2b0 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29  s\n", azHelp[i])
1d2c0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b  ;.        j = i+
1d2d0 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  1;.        n++;.
1d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d2f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d300 50 61 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  Pat);.    if( n 
1d310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
1d320 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
1d330 77 68 65 6e 20 7a 50 61 74 74 65 72 6e 20 69 73  when zPattern is
1d340 20 61 20 70 72 65 66 69 78 20 6f 66 20 65 78 61   a prefix of exa
1d350 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64  ctly one command
1d360 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64 65 20 74  , then include t
1d370 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  he.        ** de
1d380 74 61 69 6c 73 20 6f 66 20 74 68 61 74 20 63 6f  tails of that co
1d390 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 73 68 6f  mmand, which sho
1d3a0 75 6c 64 20 62 65 67 69 6e 20 61 74 20 6f 66 66  uld begin at off
1d3b0 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20  set j */.       
1d3c0 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53   while( j<ArrayS
1d3d0 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26  ize(azHelp)-1 &&
1d3e0 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27   azHelp[j][0]!='
1d3f0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
1d400 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1d410 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1d420 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  j]);.          j
1d430 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1d440 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1d450 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn n;.    }.    
1d460 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1d470 61 6e 64 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ands that contai
1d480 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e 79 77 68  n zPattern anywh
1d490 65 72 65 2e 20 20 53 68 6f 77 20 74 68 65 20 63  ere.  Show the c
1d4a0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74  omplete.    ** t
1d4b0 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61  ext of all comma
1d4c0 6e 64 73 20 74 68 61 74 20 6d 61 74 63 68 2e 20  nds that match. 
1d4d0 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1d4e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1d4f0 25 25 73 25 25 22 2c 20 7a 50 61 74 74 65 72 6e  %%s%%", zPattern
1d500 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1d510 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1d520 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1d530 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1d540 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a  ]=='.' ) j = i;.
1d550 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d560 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20  3_strlike(zPat, 
1d570 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30  azHelp[i], 0)==0
1d580 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1d590 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1d5a0 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1d5b0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1d5c0 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  j<ArraySize(azHe
1d5d0 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b  lp)-1 && azHelp[
1d5e0 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a  j+1][0]!='.' ){.
1d5f0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
1d600 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
1d610 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1d620 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20  , azHelp[j]);.  
1d630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d640 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e  i = j;.        n
1d650 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1d660 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1d670 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20  ee(zPat);.  }.  
1d680 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20  return n;.}../* 
1d690 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1d6a0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1d6b0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68  process_input(Sh
1d6c0 65 6c 6c 53 74 61 74 65 20 2a 70 29 3b 0a 0a 2f  ellState *p);../
1d6d0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1d6e0 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e  ntent of file zN
1d6f0 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ame into memory 
1d700 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1d710 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1d720 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61  .** and return a
1d730 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d740 62 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c  buffer. The call
1d750 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1d760 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a  e for freeing.**
1d770 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a   the memory..**.
1d780 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1d790 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55  pnByte is not NU
1d7a0 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73  LL, (*pnByte) is
1d7b0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1d7c0 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72  er of bytes.** r
1d7d0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63  ead..**.** For c
1d7e0 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75  onvenience, a nu
1d7f0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
1d800 65 20 69 73 20 61 6c 77 61 79 73 20 61 70 70 65  e is always appe
1d810 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1d820 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68   read.** from th
1d830 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  e file before th
1d840 65 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75  e buffer is retu
1d850 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65 20  rned. This byte 
1d860 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  is not included 
1d870 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  in.** the final 
1d880 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74  value of (*pnByt
1d890 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c  e), if applicabl
1d8a0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73  e..**.** NULL is
1d8b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79   returned if any
1d8c0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1d8d0 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c  tered. The final
1d8e0 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74   value of *pnByt
1d8f0 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65  e.** is undefine
1d900 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1d910 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1d920 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  readFile(const c
1d930 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
1d940 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45  *pnByte){.  FILE
1d950 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61   *in = fopen(zNa
1d960 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e  me, "rb");.  lon
1d970 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20  g nIn;.  size_t 
1d980 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70  nRead;.  char *p
1d990 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  Buf;.  if( in==0
1d9a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
1d9b0 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b  seek(in, 0, SEEK
1d9c0 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66  _END);.  nIn = f
1d9d0 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69  tell(in);.  rewi
1d9e0 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d  nd(in);.  pBuf =
1d9f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1da00 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66  4( nIn+1 );.  if
1da10 28 20 70 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c  ( pBuf==0 ){ fcl
1da20 6f 73 65 28 69 6e 29 3b 20 72 65 74 75 72 6e 20  ose(in); return 
1da30 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66  0; }.  nRead = f
1da40 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20  read(pBuf, nIn, 
1da50 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65  1, in);.  fclose
1da60 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  (in);.  if( nRea
1da70 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  d!=1 ){.    sqli
1da80 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a  te3_free(pBuf);.
1da90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1daa0 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20  }.  pBuf[nIn] = 
1dab0 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20  0;.  if( pnByte 
1dac0 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b  ) *pnByte = nIn;
1dad0 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
1dae0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1daf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1db00 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  SION)./*.** Clos
1db10 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53  e a single OpenS
1db20 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e  ession object an
1db30 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  d release all of
1db40 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a   its associated.
1db50 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ** resources..*/
1db60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
1db70 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53  sion_close(OpenS
1db80 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
1db90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
1dba0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c  lite3session_del
1dbb0 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  ete(pSession->p)
1dbc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1dbd0 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65  (pSession->zName
1dbe0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1dbf0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
1dc00 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
1dc10 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1dc20 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29  on->azFilter[i])
1dc30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1dc40 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
1dc50 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73  zFilter);.  mems
1dc60 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20  et(pSession, 0, 
1dc70 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69  sizeof(OpenSessi
1dc80 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  on));.}.#endif..
1dc90 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
1dca0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1dcb0 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20  cts and release 
1dcc0 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72  all associated r
1dcd0 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66  esources..*/.#if
1dce0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1dcf0 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1dd00 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
1dd10 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68  ion_close_all(Sh
1dd20 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
1dd30 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1dd40 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
1dd50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69   i++){.    sessi
1dd60 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65  on_close(&p->aSe
1dd70 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20  ssion[i]);.  }. 
1dd80 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30   p->nSession = 0
1dd90 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1dda0 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  ne session_close
1ddb0 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a  _all(X).#endif..
1ddc0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1ddd0 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c  tion of the xFil
1dde0 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ter function for
1ddf0 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e   an open session
1de00 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74  .  Omit.** any t
1de10 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22  ables named by "
1de20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22  .session filter"
1de30 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68   but let all oth
1de40 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68  er table through
1de50 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
1de60 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
1de70 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69  ESSION).static i
1de80 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65  nt session_filte
1de90 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f  r(void *pCtx, co
1dea0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
1deb0 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a  .  OpenSession *
1dec0 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e  pSession = (Open
1ded0 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20  Session*)pCtx;. 
1dee0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1def0 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1df00 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1df10 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1df20 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e  rglob(pSession->
1df30 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61  azFilter[i], zTa
1df40 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  b)==0 ) return 0
1df50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1df60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1df70 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65 20  * Try to deduce 
1df80 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c 65  the type of file
1df90 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65 64   for zName based
1dfa0 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e   on its content.
1dfb0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20    Return.** one 
1dfc0 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45  of the SHELL_OPE
1dfd0 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a  N_* constants..*
1dfe0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1dff0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
1e000 6f 72 20 69 73 20 65 6d 70 74 79 20 62 75 74 20  or is empty but 
1e010 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c  its name looks l
1e020 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63  ike a ZIP.** arc
1e030 68 69 76 65 20 61 6e 64 20 74 68 65 20 64 66 6c  hive and the dfl
1e040 74 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72 75  tZip flag is tru
1e050 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 69  e, then assume i
1e060 74 20 69 73 20 61 20 5a 49 50 20 61 72 63 68 69  t is a ZIP archi
1e070 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ve..** Otherwise
1e080 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64 69  , assume an ordi
1e090 6e 61 72 79 20 64 61 74 61 62 61 73 65 20 72 65  nary database re
1e0a0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
1e0b0 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74  filename if.** t
1e0c0 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62  he type cannot b
1e0d0 65 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72 6f  e determined fro
1e0e0 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  m content..*/.in
1e0f0 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65  t deduceDatabase
1e100 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
1e110 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74  *zName, int dflt
1e120 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20  Zip){.  FILE *f 
1e130 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
1e140 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e  rb");.  size_t n
1e150 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45  ;.  int rc = SHE
1e160 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a  LL_OPEN_UNSPEC;.
1e170 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1e180 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a  ;.  if( f==0 ){.
1e190 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70 20      if( dfltZip 
1e1a0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
1e1b0 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65  ke("%.zip",zName
1e1c0 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
1e1d0 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1e1e0 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1e1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 72 65  }else{.       re
1e200 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1e210 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20  NORMAL;.    }.  
1e220 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42  }.  n = fread(zB
1e230 75 66 2c 20 31 36 2c 20 31 2c 20 66 29 3b 0a 20  uf, 16, 1, f);. 
1e240 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d   if( n==1 && mem
1e250 63 6d 70 28 7a 42 75 66 2c 20 22 53 51 4c 69 74  cmp(zBuf, "SQLit
1e260 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 31 36 29  e format 3", 16)
1e270 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  ==0 ){.    fclos
1e280 65 28 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(f);.    return
1e290 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1e2a0 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  AL;.  }.  fseek(
1e2b0 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44  f, -25, SEEK_END
1e2c0 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  );.  n = fread(z
1e2d0 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a  Buf, 25, 1, f);.
1e2e0 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65    if( n==1 && me
1e2f0 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72  mcmp(zBuf, "Star
1e300 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20  t-Of-SQLite3-", 
1e310 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  17)==0 ){.    rc
1e320 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50   = SHELL_OPEN_AP
1e330 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65  PENDVFS;.  }else
1e340 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d  {.    fseek(f, -
1e350 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  22, SEEK_END);. 
1e360 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
1e370 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20  f, 22, 1, f);.  
1e380 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42    if( n==1 && zB
1e390 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a  uf[0]==0x50 && z
1e3a0 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20  Buf[1]==0x4b && 
1e3b0 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20  zBuf[2]==0x05.  
1e3c0 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d       && zBuf[3]=
1e3d0 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72  =0x06 ){.      r
1e3e0 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  c = SHELL_OPEN_Z
1e3f0 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73  IPFILE;.    }els
1e400 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64 66  e if( n==0 && df
1e410 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33  ltZip && sqlite3
1e420 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22  _strlike("%.zip"
1e430 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a  ,zName,0)==0 ){.
1e440 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c        rc = SHELL
1e450 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1e460 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73     }.  }.  fclos
1e470 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(f);.  return r
1e480 63 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 53  c;  .}..#ifdef S
1e490 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
1e4a0 45 52 49 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52  ERIALIZE./*.** R
1e4b0 65 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 69 6e  econstruct an in
1e4c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e4d0 20 75 73 69 6e 67 20 74 68 65 20 6f 75 74 70 75   using the outpu
1e4e0 74 20 66 72 6f 6d 20 74 68 65 20 22 64 62 74 6f  t from the "dbto
1e4f0 74 78 74 22 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e  txt".** program.
1e500 20 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 66    Read content f
1e510 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 69 6e 20  rom the file in 
1e520 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2e 20  p->zDbFilename. 
1e530 20 49 66 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61   If p->zDbFilena
1e540 6d 65 0a 2a 2a 20 69 73 20 30 2c 20 74 68 65 6e  me.** is 0, then
1e550 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e 64   read from stand
1e560 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74  ard input..*/.st
1e570 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
1e580 61 72 20 2a 72 65 61 64 48 65 78 44 62 28 53 68  ar *readHexDb(Sh
1e590 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1e5a0 20 2a 70 6e 44 61 74 61 29 7b 0a 20 20 75 6e 73   *pnData){.  uns
1e5b0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20 3d 20  igned char *a = 
1e5c0 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a  0;.  int nLine;.
1e5d0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
1e5e0 6e 74 20 70 67 73 7a 20 3d 20 30 3b 0a 20 20 69  nt pgsz = 0;.  i
1e5f0 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  nt iOffset = 0;.
1e600 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e    int j, k;.  in
1e610 74 20 72 63 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  t rc;.  FILE *in
1e620 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
1e630 20 78 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a   x[16];.  char z
1e640 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a 20 20 69 66  Line[1000];.  if
1e650 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  ( p->zDbFilename
1e660 20 29 7b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70   ){.    in = fop
1e670 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  en(p->zDbFilenam
1e680 65 2c 20 22 72 22 29 3b 0a 20 20 20 20 69 66 28  e, "r");.    if(
1e690 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
1e6a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e6b0 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "cannot open
1e6c0 20 5c 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64   \"%s\" for read
1e6d0 69 6e 67 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69  ing\n", p->zDbFi
1e6e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  lename);.      r
1e6f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e700 20 20 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20     nLine = 0;.  
1e710 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20  }else{.    in = 
1e720 70 2d 3e 69 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65  p->in;.    nLine
1e730 20 3d 20 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20   = p->lineno;.  
1e740 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 69 6e    if( in==0 ) in
1e750 20 3d 20 73 74 64 69 6e 3b 0a 20 20 7d 0a 20 20   = stdin;.  }.  
1e760 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 6e  *pnData = 0;.  n
1e770 4c 69 6e 65 2b 2b 3b 0a 20 20 69 66 28 20 66 67  Line++;.  if( fg
1e780 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
1e790 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 3d 3d 30  f(zLine), in)==0
1e7a0 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44   ) goto readHexD
1e7b0 62 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20  b_error;.  rc = 
1e7c0 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c  sscanf(zLine, "|
1e7d0 20 73 69 7a 65 20 25 64 20 70 61 67 65 73 69 7a   size %d pagesiz
1e7e0 65 20 25 64 22 2c 20 26 6e 2c 20 26 70 67 73 7a  e %d", &n, &pgsz
1e7f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 32 20 29  );.  if( rc!=2 )
1e800 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f   goto readHexDb_
1e810 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 6e 3c 30  error;.  if( n<0
1e820 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44   ) goto readHexD
1e830 62 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  b_error;.  if( p
1e840 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a 3e  gsz<512 || pgsz>
1e850 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 26 28  65536 || (pgsz&(
1e860 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 20 67 6f  pgsz-1))!=0 ) go
1e870 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e880 6f 72 3b 0a 20 20 6e 20 3d 20 28 6e 2b 70 67 73  or;.  n = (n+pgs
1e890 7a 2d 31 29 26 7e 28 70 67 73 7a 2d 31 29 3b 20  z-1)&~(pgsz-1); 
1e8a0 20 2f 2a 20 52 6f 75 6e 64 20 6e 20 75 70 20 74   /* Round n up t
1e8b0 6f 20 74 68 65 20 6e 65 78 74 20 6d 75 6c 74 69  o the next multi
1e8c0 70 6c 65 20 6f 66 20 70 67 73 7a 20 2a 2f 0a 20  ple of pgsz */. 
1e8d0 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   a = sqlite3_mal
1e8e0 6c 6f 63 28 20 6e 20 3f 20 6e 20 3a 20 31 20 29  loc( n ? n : 1 )
1e8f0 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a  ;.  if( a==0 ){.
1e900 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1e910 73 74 64 65 72 72 2c 20 22 4f 75 74 20 6f 66 20  stderr, "Out of 
1e920 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20  memory!\n");.   
1e930 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f   goto readHexDb_
1e940 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d  error;.  }.  mem
1e950 73 65 74 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20  set(a, 0, n);.  
1e960 69 66 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20  if( pgsz<512 || 
1e970 70 67 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70  pgsz>65536 || (p
1e980 67 73 7a 20 26 20 28 70 67 73 7a 2d 31 29 29 21  gsz & (pgsz-1))!
1e990 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
1e9a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 69  rintf(stderr, "i
1e9b0 6e 76 61 6c 69 64 20 70 61 67 65 73 69 7a 65 5c  nvalid pagesize\
1e9c0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65  n");.    goto re
1e9d0 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20  adHexDb_error;. 
1e9e0 20 7d 0a 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b   }.  for(nLine++
1e9f0 3b 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ; fgets(zLine, s
1ea00 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e  izeof(zLine), in
1ea10 29 21 3d 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a  )!=0; nLine++){.
1ea20 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28      rc = sscanf(
1ea30 7a 4c 69 6e 65 2c 20 22 7c 20 70 61 67 65 20 25  zLine, "| page %
1ea40 64 20 6f 66 66 73 65 74 20 25 64 22 2c 20 26 6a  d offset %d", &j
1ea50 2c 20 26 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  , &k);.    if( r
1ea60 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 4f  c==2 ){.      iO
1ea70 66 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20  ffset = k;.     
1ea80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1ea90 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
1eaa0 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22  (zLine, "| end "
1eab0 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
1eac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ead0 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c    rc = sscanf(zL
1eae0 69 6e 65 2c 22 7c 20 25 64 3a 20 25 78 20 25 78  ine,"| %d: %x %x
1eaf0 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1eb00 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1eb10 78 20 25 78 20 25 78 20 25 78 22 2c 0a 20 20 20  x %x %x %x",.   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c               &j,
1eb30 20 26 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26   &x[0], &x[1], &
1eb40 78 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b  x[2], &x[3], &x[
1eb50 34 5d 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d  4], &x[5], &x[6]
1eb60 2c 20 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20  , &x[7],.       
1eb70 20 20 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20           &x[8], 
1eb80 26 78 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26  &x[9], &x[10], &
1eb90 78 5b 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26  x[11], &x[12], &
1eba0 78 5b 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26  x[13], &x[14], &
1ebb0 78 5b 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20  x[15]);.    if( 
1ebc0 72 63 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20  rc==17 ){.      
1ebd0 6b 20 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20  k = iOffset+j;. 
1ebe0 20 20 20 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e       if( k+16<=n
1ebf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1ec00 69 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ii;.        for(
1ec10 69 69 3d 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b  ii=0; ii<16; ii+
1ec20 2b 29 20 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69  +) a[k+ii] = x[i
1ec30 69 5d 26 30 78 66 66 3b 0a 20 20 20 20 20 20 7d  i]&0xff;.      }
1ec40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e  .    }.  }.  *pn
1ec50 44 61 74 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20  Data = n;.  if( 
1ec60 69 6e 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20  in!=p->in ){.   
1ec70 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
1ec80 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e  else{.    p->lin
1ec90 65 6e 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d  eno = nLine;.  }
1eca0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65  .  return a;..re
1ecb0 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20  adHexDb_error:. 
1ecc0 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29   if( in!=p->in )
1ecd0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1ece0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
1ecf0 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e  hile( fgets(zLin
1ed00 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  e, sizeof(zLine)
1ed10 2c 20 70 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20  , p->in)!=0 ){. 
1ed20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20       nLine++;.  
1ed30 20 20 20 20 69 66 28 73 74 72 6e 63 6d 70 28 7a      if(strncmp(z
1ed40 4c 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20  Line, "| end ", 
1ed50 36 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  6)==0 ) break;. 
1ed60 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65     }.    p->line
1ed70 6e 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a  no = nLine;.  }.
1ed80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1ed90 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
1eda0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 20 6f  (stderr,"Error o
1edb0 6e 20 6c 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68  n line %d of --h
1edc0 65 78 64 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e  exdb input\n", n
1edd0 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Line);.  return 
1ede0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1edf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
1ee00 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a  ERIALIZE */../*.
1ee10 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69  ** Scalar functi
1ee20 6f 6e 20 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22  on "shell_int32"
1ee30 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
1ee40 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1ee50 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65  ction.** must be
1ee60 20 61 20 62 6c 6f 62 2e 20 54 68 65 20 73 65 63   a blob. The sec
1ee70 6f 6e 64 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69  ond a non-negati
1ee80 76 65 20 69 6e 74 65 67 65 72 2e 20 54 68 69 73  ve integer. This
1ee90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 61   function.** rea
1eea0 64 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ds and returns a
1eeb0 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   32-bit big-endi
1eec0 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  an integer from 
1eed0 62 79 74 65 0a 2a 2a 20 6f 66 66 73 65 74 20 28  byte.** offset (
1eee0 34 2a 3c 61 72 67 32 3e 29 20 6f 66 20 74 68 65  4*<arg2>) of the
1eef0 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   blob..*/.static
1ef00 20 76 6f 69 64 20 73 68 65 6c 6c 49 6e 74 33 32   void shellInt32
1ef10 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1ef20 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
1ef30 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71   int argc, .  sq
1ef40 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1ef50 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
1ef60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c  signed char *pBl
1ef70 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b  ob;.  int nBlob;
1ef80 0a 20 20 69 6e 74 20 69 49 6e 74 3b 0a 0a 20 20  .  int iInt;..  
1ef90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1efa0 28 61 72 67 63 29 3b 0a 20 20 6e 42 6c 6f 62 20  (argc);.  nBlob 
1efb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1efc0 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
1efd0 20 20 70 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74    pBlob = (const
1efe0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1eff0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
1f000 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
1f010 49 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Int = sqlite3_va
1f020 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
1f030 3b 0a 0a 20 20 69 66 28 20 69 49 6e 74 3e 3d 30  ;..  if( iInt>=0
1f040 20 26 26 20 28 69 49 6e 74 2b 31 29 2a 34 3c 3d   && (iInt+1)*4<=
1f050 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 63 6f 6e  nBlob ){.    con
1f060 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1f070 20 2a 61 20 3d 20 26 70 42 6c 6f 62 5b 69 49 6e   *a = &pBlob[iIn
1f080 74 2a 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  t*4];.    sqlite
1f090 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 3d 20 28  3_int64 iVal = (
1f0a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61  (sqlite3_int64)a
1f0b0 5b 30 5d 3c 3c 32 34 29 0a 20 20 20 20 20 20 20  [0]<<24).       
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  + ((sqlite3_int6
1f0e0 34 29 61 5b 31 5d 3c 3c 31 36 29 0a 20 20 20 20  4)a[1]<<16).    
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69     + ((sqlite3_i
1f110 6e 74 36 34 29 61 5b 32 5d 3c 3c 20 38 29 0a 20  nt64)a[2]<< 8). 
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65        + ((sqlite
1f140 33 5f 69 6e 74 36 34 29 61 5b 33 5d 3c 3c 20 30  3_int64)a[3]<< 0
1f150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1f160 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
1f170 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  ext, iVal);.  }.
1f180 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20  }../*.** Scalar 
1f190 66 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f  function "shell_
1f1a0 69 64 71 75 6f 74 65 28 58 29 22 20 72 65 74 75  idquote(X)" retu
1f1b0 72 6e 73 20 73 74 72 69 6e 67 20 58 20 71 75 6f  rns string X quo
1f1c0 74 65 64 20 61 73 20 61 6e 20 69 64 65 6e 74 69  ted as an identi
1f1d0 66 69 65 72 2c 0a 2a 2a 20 75 73 69 6e 67 20 22  fier,.** using "
1f1e0 2e 2e 2e 22 20 77 69 74 68 20 69 6e 74 65 72 6e  ..." with intern
1f1f0 61 6c 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20  al double-quote 
1f200 63 68 61 72 61 63 74 65 72 73 20 64 6f 75 62 6c  characters doubl
1f210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1f220 69 64 20 73 68 65 6c 6c 49 64 51 75 6f 74 65 28  id shellIdQuote(
1f230 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1f240 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
1f250 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c  int argc, .  sql
1f260 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1f270 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
1f280 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
1f290 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1f2a0 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1f2b0 30 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0]);.  UNUSED_PA
1f2c0 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
1f2d0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1f2e0 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
1f2f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
1f300 77 5c 22 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  w\"", zName);.  
1f310 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f320 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1f330 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
1f340 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
1f350 2a 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  * Scalar functio
1f360 6e 20 22 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f  n "shell_escape_
1f370 63 72 6e 6c 22 20 75 73 65 64 20 62 79 20 74 68  crnl" used by th
1f380 65 20 2e 72 65 63 6f 76 65 72 20 63 6f 6d 6d 61  e .recover comma
1f390 6e 64 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  nd..** The argum
1f3a0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
1f3b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
1f3c0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 62 75 69  he output of bui
1f3d0 6c 74 2d 69 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f  lt-in.** functio
1f3e0 6e 20 71 75 6f 74 65 28 29 2e 20 49 66 20 74 68  n quote(). If th
1f3f0 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
1f400 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69  r of the input i
1f410 73 20 22 27 22 2c 20 0a 2a 2a 20 69 6e 64 69 63  s "'", .** indic
1f420 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 76  ating that the v
1f430 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 71  alue passed to q
1f440 75 6f 74 65 28 29 20 77 61 73 20 61 20 74 65 78  uote() was a tex
1f450 74 20 76 61 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e  t value,.** then
1f460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
1f470 65 61 72 63 68 65 73 20 74 68 65 20 69 6e 70 75  earches the inpu
1f480 74 20 66 6f 72 20 22 5c 6e 22 20 61 6e 64 20 22  t for "\n" and "
1f490 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 0a 2a  \r" characters.*
1f4a0 2a 20 61 6e 64 20 61 64 64 73 20 61 20 77 72 61  * and adds a wra
1f4b0 70 70 65 72 20 73 69 6d 69 6c 61 72 20 74 6f 20  pper similar to 
1f4c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1f4d0 2a 0a 2a 2a 20 20 20 72 65 70 6c 61 63 65 28 72  *.**   replace(r
1f4e0 65 70 6c 61 63 65 28 3c 69 6e 70 75 74 3e 2c 20  eplace(<input>, 
1f4f0 27 5c 6e 27 2c 20 63 68 61 72 28 31 30 29 2c 20  '\n', char(10), 
1f500 27 5c 72 27 2c 20 63 68 61 72 28 31 33 29 29 3b  '\r', char(13));
1f510 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
1f520 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
1f530 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69  r of the input i
1f540 73 20 6e 6f 74 20 22 27 22 2c 20 74 68 65 6e 20  s not "'", then 
1f550 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
1f560 20 69 6e 70 75 74 20 69 73 20 72 65 74 75 72 6e   input is return
1f570 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1f580 69 64 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72  id shellEscapeCr
1f590 6e 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nl(.  sqlite3_co
1f5a0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1f5b0 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20  .  int argc, .  
1f5c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1f5d0 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
1f5e0 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63  char *zText = (c
1f5f0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1f600 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1f610 67 76 5b 30 5d 29 3b 0a 20 20 55 4e 55 53 45 44  gv[0]);.  UNUSED
1f620 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
1f630 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 5b 30 5d  ;.  if( zText[0]
1f640 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69 6e  =='\'' ){.    in
1f650 74 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65  t nText = sqlite
1f660 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
1f670 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20  gv[0]);.    int 
1f680 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  i;.    char zBuf
1f690 31 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72 20  1[20];.    char 
1f6a0 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20 63  zBuf2[20];.    c
1f6b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d  onst char *zNL =
1f6c0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
1f6d0 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20  ar *zCR = 0;.   
1f6e0 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20   int nCR = 0;.  
1f6f0 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 0a    int nNL = 0;..
1f700 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65      for(i=0; zTe
1f710 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  xt[i]; i++){.   
1f720 20 20 20 69 66 28 20 7a 4e 4c 3d 3d 30 20 26 26     if( zNL==0 &&
1f730 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20   zText[i]=='\n' 
1f740 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 4c 20 3d  ){.        zNL =
1f750 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a   unused_string(z
1f760 54 65 78 74 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  Text, "\\n", "\\
1f770 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
1f780 20 20 20 20 20 20 6e 4e 4c 20 3d 20 28 69 6e 74        nNL = (int
1f790 29 73 74 72 6c 65 6e 28 7a 4e 4c 29 3b 0a 20 20  )strlen(zNL);.  
1f7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f7b0 7a 43 52 3d 3d 30 20 26 26 20 7a 54 65 78 74 5b  zCR==0 && zText[
1f7c0 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20  i]=='\r' ){.    
1f7d0 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
1f7e0 5f 73 74 72 69 6e 67 28 7a 54 65 78 74 2c 20 22  _string(zText, "
1f7f0 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a  \\r", "\\015", z
1f800 42 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  Buf2);.        n
1f810 43 52 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  CR = (int)strlen
1f820 28 7a 43 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (zCR);.      }. 
1f830 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 4e     }..    if( zN
1f840 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a 20 20 20 20  L || zCR ){.    
1f850 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0a    int iOut = 0;.
1f860 20 20 20 20 20 20 69 36 34 20 6e 4d 61 78 20 3d        i64 nMax =
1f870 20 28 6e 4e 4c 20 3e 20 6e 43 52 29 20 3f 20 6e   (nNL > nCR) ? n
1f880 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20 20 20 20 20  NL : nCR;.      
1f890 69 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 61  i64 nAlloc = nMa
1f8a0 78 20 2a 20 6e 54 65 78 74 20 2b 20 28 6e 4d 61  x * nText + (nMa
1f8b0 78 2b 36 34 29 2a 32 3b 0a 20 20 20 20 20 20 63  x+64)*2;.      c
1f8c0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63 68 61  har *zOut = (cha
1f8d0 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
1f8e0 63 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  c64(nAlloc);.   
1f8f0 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29     if( zOut==0 )
1f900 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f910 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
1f920 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
1f930 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
1f940 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1f950 28 20 7a 4e 4c 20 26 26 20 7a 43 52 20 29 7b 0a  ( zNL && zCR ){.
1f960 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f970 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72 65 70  zOut[iOut], "rep
1f980 6c 61 63 65 28 72 65 70 6c 61 63 65 28 22 2c 20  lace(replace(", 
1f990 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 75  16);.        iOu
1f9a0 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 7d  t += 16;.      }
1f9b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1f9c0 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f9d0 2c 20 22 72 65 70 6c 61 63 65 28 22 2c 20 38 29  , "replace(", 8)
1f9e0 3b 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b  ;.        iOut +
1f9f0 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 8;.      }.   
1fa00 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78     for(i=0; zTex
1fa10 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t[i]; i++){.    
1fa20 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69 5d      if( zText[i]
1fa30 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
1fa40 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1fa50 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c  [iOut], zNL, nNL
1fa60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75  );.          iOu
1fa70 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20  t += nNL;.      
1fa80 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 65 78    }else if( zTex
1fa90 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20  t[i]=='\r' ){.  
1faa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1fab0 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c  zOut[iOut], zCR,
1fac0 20 6e 43 52 29 3b 0a 20 20 20 20 20 20 20 20 20   nCR);.         
1fad0 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a 20 20   iOut += nCR;.  
1fae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1faf0 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 4f 75 74         zOut[iOut
1fb00 5d 20 3d 20 7a 54 65 78 74 5b 69 5d 3b 0a 20 20  ] = zText[i];.  
1fb10 20 20 20 20 20 20 20 20 69 4f 75 74 2b 2b 3b 0a          iOut++;.
1fb20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fb30 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c  }..      if( zNL
1fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1fb50 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1fb60 22 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b  ",'", 2); iOut +
1fb70 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  = 2;.        mem
1fb80 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1fb90 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20 69 4f 75 74   zNL, nNL); iOut
1fba0 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20   += nNL;.       
1fbb0 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1fbc0 75 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31 30  ut], "', char(10
1fbd0 29 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b  ))", 12); iOut +
1fbe0 3d 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = 12;.      }.  
1fbf0 20 20 20 20 69 66 28 20 7a 43 52 20 29 7b 0a 20      if( zCR ){. 
1fc00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
1fc10 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22 2c  Out[iOut], ",'",
1fc20 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b 0a   2); iOut += 2;.
1fc30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1fc40 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c  zOut[iOut], zCR,
1fc50 20 6e 43 52 29 3b 20 69 4f 75 74 20 2b 3d 20 6e   nCR); iOut += n
1fc60 43 52 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  CR;.        memc
1fc70 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1fc80 22 27 2c 20 63 68 61 72 28 31 33 29 29 22 2c 20  "', char(13))", 
1fc90 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32 3b  12); iOut += 12;
1fca0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1fcb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1fcc0 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 4f 75  ext(context, zOu
1fcd0 74 2c 20 69 4f 75 74 2c 20 53 51 4c 49 54 45 5f  t, iOut, SQLITE_
1fce0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
1fcf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1fd00 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
1fd10 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
1fd20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1fd30 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
1fd40 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20 46  rgv[0]);.}../* F
1fd50 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62  lags for open_db
1fd60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ()..**.** The de
1fd70 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f  fault behavior o
1fd80 66 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74  f open_db() is t
1fd90 6f 20 65 78 69 74 28 31 29 20 69 66 20 74 68 65  o exit(1) if the
1fda0 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20   database fails 
1fdb0 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65  to.** open.  The
1fdc0 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1fdd0 56 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20  VE flag changes 
1fde0 74 68 61 74 20 73 6f 20 74 68 61 74 20 69 74 20  that so that it 
1fdf0 70 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a  prints an error.
1fe00 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74  ** but still ret
1fe10 75 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c  urns without cal
1fe20 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a  ling exit..**.**
1fe30 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50   The OPEN_DB_ZIP
1fe40 46 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73  FILE flag causes
1fe50 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72   open_db() to pr
1fe60 65 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c  efer to open fil
1fe70 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61  es as a.** ZIP a
1fe80 72 63 68 69 76 65 20 69 66 20 74 68 65 20 66 69  rchive if the fi
1fe90 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
1fea0 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e  t or is empty an
1feb0 64 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68  d its name match
1fec0 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20  es.** the *.zip 
1fed0 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66  pattern..*/.#def
1fee0 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  ine OPEN_DB_KEEP
1fef0 41 4c 49 56 45 20 20 20 30 78 30 30 31 20 20 20  ALIVE   0x001   
1ff00 2f 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72 20  /* Return after 
1ff10 65 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f  error if true */
1ff20 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42  .#define OPEN_DB
1ff30 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78 30  _ZIPFILE     0x0
1ff40 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20  02   /* Open as 
1ff50 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63  ZIP if name matc
1ff60 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a  hes *.zip */../*
1ff70 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1ff80 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
1ff90 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  en.  If it is no
1ffa0 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e  t, then open it.
1ffb0 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61    If.** the data
1ffc0 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70  base fails to op
1ffd0 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72  en, print an err
1ffe0 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65  or message and e
1fff0 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  xit..*/.static v
20000 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c  oid open_db(Shel
20010 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f  lState *p, int o
20020 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  penFlags){.  if(
20030 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
20040 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20050 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  ==SHELL_OPEN_UNS
20060 50 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  PEC ){.      if(
20070 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d   p->zDbFilename=
20080 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65  =0 || p->zDbFile
20090 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  name[0]==0 ){.  
200a0 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
200b0 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  e = SHELL_OPEN_N
200c0 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  ORMAL;.      }el
200d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  se{.        p->o
200e0 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65  penMode = (u8)de
200f0 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
20100 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
20110 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
20130 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e  openFlags & OPEN
20140 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29  _DB_ZIPFILE)!=0)
20150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20160 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
20170 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  penMode ){.     
20180 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
20190 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20  _APPENDVFS: {.  
201a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
201b0 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
201c0 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20  name, &p->db, . 
201d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
201e0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
201f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
20200 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a  TE, "apndvfs");.
20210 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
20230 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58  e SHELL_OPEN_HEX
20240 44 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53  DB:.      case S
20250 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
20260 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20  ALIZE: {.       
20270 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c   sqlite3_open(0,
20280 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20   &p->db);.      
20290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
202a0 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
202b0 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20  L_OPEN_ZIPFILE: 
202c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
202d0 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
202e0 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ", &p->db);.    
202f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20300 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
20310 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
20320 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
20330 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e  ite3_open_v2(p->
20340 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
20350 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  >db, SQLITE_OPEN
20360 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20  _READONLY, 0);. 
20370 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20380 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
20390 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 53 48 41 52   SHELL_OPEN_SHAR
203a0 45 44 53 43 48 45 4d 41 3a 20 7b 0a 20 20 20 20  EDSCHEMA: {.    
203b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
203c0 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  _v2(p->zDbFilena
203d0 6d 65 2c 20 26 70 2d 3e 64 62 2c 0a 20 20 20 20  me, &p->db,.    
203e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
203f0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
20400 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
20410 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
20420 44 5f 53 43 48 45 4d 41 2c 30 29 3b 0a 20 20 20  D_SCHEMA,0);.   
20430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20440 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
20450 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
20460 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  :.      case SHE
20470 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20  LL_OPEN_NORMAL: 
20480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20490 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c  3_open(p->zDbFil
204a0 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  ename, &p->db);.
204b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
204c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
204d0 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
204e0 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
204f0 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
20500 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
20510 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
20520 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
20530 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
20540 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
20550 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
20560 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
20570 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
20580 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
20590 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
205a0 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e  openFlags & OPEN
205b0 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b  _DB_KEEPALIVE ){
205c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
205d0 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
205e0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
205f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
20600 20 7d 0a 20 20 20 20 20 20 65 78 69 74 28 31 29   }.      exit(1)
20610 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
20620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
20630 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
20640 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
20650 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
20660 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
20670 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
20680 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  o_init(p->db, 0,
20690 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
206a0 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70  _shathree_init(p
206b0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
206c0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
206d0 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ion_init(p->db, 
206e0 30 2c 20 30 29 3b 0a 23 69 66 20 21 64 65 66 69  0, 0);.#if !defi
206f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20700 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
20710 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20720 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
20730 41 42 29 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  AB).    sqlite3_
20740 64 62 64 61 74 61 5f 69 6e 69 74 28 70 2d 3e 64  dbdata_init(p->d
20750 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  b, 0, 0);.#endif
20760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
20770 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
20780 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
20790 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
207a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
207b0 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
207c0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
207d0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
207e0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
207f0 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
20800 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
20810 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
20840 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
20850 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
20860 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
20870 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
20880 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
20890 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
208c0 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
208d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
208e0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
208f0 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
20900 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
20910 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20  8, p,.          
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
20940 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
20950 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20960 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
20970 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22 2c 20  l_escape_crnl", 
20980 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
20990 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
209b0 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 2c 20  hellEscapeCrnl, 
209c0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
209d0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
209e0 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
209f0 5f 69 6e 74 33 32 22 2c 20 32 2c 20 53 51 4c 49  _int32", 2, SQLI
20a00 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 49 6e 74          shellInt
20a30 33 32 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  32, 0, 0);.    s
20a40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20a50 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
20a60 68 65 6c 6c 5f 69 64 71 75 6f 74 65 22 2c 20 31  hell_idquote", 1
20a70 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
20a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
20aa0 65 6c 6c 49 64 51 75 6f 74 65 2c 20 30 2c 20 30  ellIdQuote, 0, 0
20ab0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20ac0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
20ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
20ae0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
20af0 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51  b, "edit", 1, SQ
20b00 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
20b30 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
20b40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20b50 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
20b60 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  dit", 2, SQLITE_
20b70 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
20ba0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
20bb0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20bc0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
20bd0 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68  FILE ){.      ch
20be0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
20bf0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
20c00 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
20c10 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55  TUAL TABLE zip U
20c20 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29  SING zipfile(%Q)
20c30 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ;", p->zDbFilena
20c40 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
20c50 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
20c60 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
20c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20c80 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 23  e(zSql);.    }.#
20c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20ca0 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
20cb0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 69 66 28      else.    if(
20cc0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
20cd0 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
20ce0 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d  LIZE || p->openM
20cf0 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20d00 48 45 58 44 42 20 29 7b 0a 20 20 20 20 20 20 69  HEXDB ){.      i
20d10 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  nt rc;.      int
20d20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
20d30 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20d40 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66  *aData;.      if
20d50 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
20d60 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
20d70 41 4c 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  ALIZE ){.       
20d80 20 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e   aData = (unsign
20d90 65 64 20 63 68 61 72 2a 29 72 65 61 64 46 69 6c  ed char*)readFil
20da0 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  e(p->zDbFilename
20db0 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
20dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20dd0 61 44 61 74 61 20 3d 20 72 65 61 64 48 65 78 44  aData = readHexD
20de0 62 28 70 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  b(p, &nData);.  
20df0 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 3d        if( aData=
20e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20e10 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
20e20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20e30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73  rc = sqlite3_des
20e40 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20  erialize(p->db, 
20e50 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e  "main", aData, n
20e60 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20  Data, nData,.   
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
20e90 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a  ZE_RESIZEABLE |.
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49     SQLITE_DESERI
20ec0 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53  ALIZE_FREEONCLOS
20ed0 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
20ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
20ef0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20f00 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f  "Error: sqlite3_
20f10 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72 65  deserialize() re
20f20 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
20f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20f40 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20 29  if( p->szMax>0 )
20f50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20f60 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
20f70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51  ->db, "main", SQ
20f80 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
20f90 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61 78  LIMIT, &p->szMax
20fa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20fb0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
20fc0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
20fd0 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
20fe0 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  es connection.  
20ff0 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 2a  Report errors..*
21000 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62 28  /.void close_db(
21010 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
21020 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
21030 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69 66  _close(db);.  if
21040 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
21050 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21060 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f  "Error: sqlite3_
21070 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73 20  close() returns 
21080 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %d: %s\n",.     
21090 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f 65     rc, sqlite3_e
210a0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 20  rrmsg(db));.  } 
210b0 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41  .}..#if HAVE_REA
210c0 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44  DLINE || HAVE_ED
210d0 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61  ITLINE./*.** Rea
210e0 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  dline completion
210f0 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74   callbacks.*/.st
21100 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 6c  atic char *readl
21110 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67  ine_completion_g
21120 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20 63  enerator(const c
21130 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20 73  har *text, int s
21140 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20  tate){.  static 
21150 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
21160 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
21170 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74 61  *zRet;.  if( sta
21180 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  te==0 ){.    cha
21190 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c  r *zSql;.    sql
211a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
211b0 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  tmt);.    zSql =
211c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
211d0 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  ("SELECT DISTINC
211e0 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c  T candidate COLL
211f0 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20  ATE nocase".    
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63         "  FROM c
21220 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52  ompletion(%Q) OR
21230 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74 29  DER BY 1", text)
21240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72  ;.    sqlite3_pr
21250 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
21260 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
21270 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
21280 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
21290 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
212a0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
212b0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
212c0 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70 28    zRet = strdup(
212d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
212e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
212f0 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d  (pStmt, 0));.  }
21300 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
21310 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
21320 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30  );.    pStmt = 0
21330 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a  ;.    zRet = 0;.
21340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
21350 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72  t;.}.static char
21360 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70   **readline_comp
21370 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
21380 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 53  r *zText, int iS
21390 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b  tart, int iEnd){
213a0 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f  .  rl_attempted_
213b0 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20  completion_over 
213c0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c  = 1;.  return rl
213d0 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63  _completion_matc
213e0 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64 6c  hes(zText, readl
213f0 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67  ine_completion_g
21400 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65  enerator);.}..#e
21410 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49  lif HAVE_LINENOI
21420 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69  SE./*.** Linenoi
21430 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61  se completion ca
21440 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  llback.*/.static
21450 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f   void linenoise_
21460 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
21470 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69   char *zLine, li
21480 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f  nenoiseCompletio
21490 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e  ns *lc){.  int n
214a0 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Line = strlen30(
214b0 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c  zLine);.  int i,
214c0 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74   iStart;.  sqlit
214d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
214e0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
214f0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
21500 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e  00];..  if( nLin
21510 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33  e>sizeof(zBuf)-3
21520 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
21530 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20  ( zLine[0]=='.' 
21540 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27  || zLine[0]=='#'
21550 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
21560 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20  i=nLine-1; i>=0 
21570 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e  && (isalnum(zLin
21580 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69  e[i]) || zLine[i
21590 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a  ]=='_'); i--){}.
215a0 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31    if( i==nLine-1
215b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74   ) return;.  iSt
215c0 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d  art = i+1;.  mem
215d0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
215e0 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c   iStart);.  zSql
215f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21600 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49  tf("SELECT DISTI
21610 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f  NCT candidate CO
21620 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63         "  FROM c
21650 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29  ompletion(%Q,%Q)
21660 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20   ORDER BY 1",.  
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53         &zLine[iS
21690 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20  tart], zLine);. 
216a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
216b0 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53  _v2(globalDb, zS
216c0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
216d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
216e0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  ee(zSql);.  sqli
216f0 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44  te3_exec(globalD
21700 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  b, "PRAGMA page_
21710 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29  count", 0, 0, 0)
21720 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63  ; /* Load the sc
21730 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28  hema */.  while(
21740 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
21750 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
21760 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
21770 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20  ar *zCompletion 
21780 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
21790 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
217a0 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
217b0 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f    int nCompletio
217c0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
217d0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
217e0 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61  0);.    if( iSta
217f0 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c  rt+nCompletion <
21800 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20   sizeof(zBuf)-1 
21810 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
21820 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f  zBuf+iStart, zCo
21830 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c  mpletion, nCompl
21840 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20  etion+1);.      
21850 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70  linenoiseAddComp
21860 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29  letion(lc, zBuf)
21870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
21880 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
21890 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Stmt);.}.#endif.
218a0 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67  ./*.** Do C-lang
218b0 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f  uage style dequo
218c0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c  ting..**.**    \
218d0 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a  a    -> alarm.**
218e0 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63      \b    -> bac
218f0 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20  kspace.**    \t 
21900 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20     -> tab.**    
21910 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65  \n    -> newline
21920 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20  .**    \v    -> 
21930 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20  vertical tab.** 
21940 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d     \f    -> form
21950 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20   feed.**    \r  
21960 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65    -> carriage re
21970 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20  turn.**    \s   
21980 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20   -> space.**    
21990 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20  \"    -> ".**   
219a0 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20   \'    -> '.**  
219b0 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73    \\    -> backs
219c0 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20  lash.**    \NNN 
219d0 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63   -> ascii charac
219e0 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c  ter NNN in octal
219f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21a00 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
21a10 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  hes(char *z){.  
21a20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
21a30 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   c;.  while( *z 
21a40 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b  && *z!='\\' ) z+
21a50 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
21a60 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
21a70 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
21a80 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69  ( c=='\\' && z[i
21a90 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  +1]!=0 ){.      
21aa0 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20  c = z[++i];.    
21ab0 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a    if( c=='a' ){.
21ac0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27          c = '\a'
21ad0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21ae0 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20  ( c=='b' ){.    
21af0 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20      c = '\b';.  
21b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21b10 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='t' ){.        
21b20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20  c = '\t';.      
21b30 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27  }else if( c=='n'
21b40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21b50 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\n';.      }els
21b60 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a  e if( c=='v' ){.
21b70 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27          c = '\v'
21b80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21b90 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
21ba0 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20      c = '\f';.  
21bb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21bc0 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='r' ){.        
21bd0 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
21be0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
21bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21c00 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  '"';.      }else
21c10 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a   if( c=='\'' ){.
21c20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27          c = '\''
21c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21c40 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
21c50 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20       c = '\\';. 
21c60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
21c70 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20  >='0' && c<='7' 
21c80 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20  ){.        c -= 
21c90 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  '0';.        if(
21ca0 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
21cb0 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
21cc0 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
21cd0 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
21ce0 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
21cf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
21d00 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
21d10 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
21d20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
21d30 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
21d40 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
21d50 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
21d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21d70 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
21d80 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a  = c;.  }.  if( j
21d90 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d  <i ) z[j] = 0;.}
21da0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
21db0 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72  t zArg as either
21dc0 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61   an integer or a
21dd0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
21de0 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a   Return 1 or 0.*
21df0 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46  * for TRUE and F
21e00 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68  ALSE.  Return th
21e10 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
21e20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
21e30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
21e40 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74  oleanValue(const
21e50 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
21e60 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72  int i;.  if( zAr
21e70 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
21e80 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
21e90 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67   for(i=2; hexDig
21ea0 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29  itValue(zArg[i])
21eb0 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65  >=0; i++){}.  }e
21ec0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
21ed0 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
21ee0 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
21ef0 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28  i++){}.  }.  if(
21f00 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d   i>0 && zArg[i]=
21f10 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74  =0 ) return (int
21f20 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  )(integerValue(z
21f30 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66  Arg) & 0xfffffff
21f40 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f);.  if( sqlite
21f50 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
21f60 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
21f70 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
21f80 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
21f90 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
21fa0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
21fb0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
21fc0 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
21fd0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
21fe0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
21ff0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74  turn 0;.  }.  ut
22000 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
22010 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20  , "ERROR: Not a 
22020 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c  boolean value: \
22030 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20  "%s\". Assuming 
22040 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"no\".\n",.    
22050 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72        zArg);.  r
22060 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22070 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
22080 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f   shell flag acco
22090 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65  rding to a boole
220a0 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
220b0 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c  tic void setOrCl
220c0 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61  earFlag(ShellSta
220d0 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  te *p, unsigned 
220e0 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61  mFlag, const cha
220f0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20  r *zArg){.  if( 
22100 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72  booleanValue(zAr
22110 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  g) ){.    ShellS
22120 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  etFlag(p, mFlag)
22130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
22140 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
22150 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a   mFlag);.  }.}..
22160 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
22170 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
22180 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
22190 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
221a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
221b0 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
221c0 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
221d0 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
221e0 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
221f0 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
22200 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
22210 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
22220 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
22230 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
22240 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
22250 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
22260 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
22270 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
22280 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69  the output.** fi
22290 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e  lename is "off".
222a0 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .*/.static FILE 
222b0 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65  *output_file_ope
222c0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
222d0 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f  ile, int bTextMo
222e0 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a  de){.  FILE *f;.
222f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
22300 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  le,"stdout")==0 
22310 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75  ){.    f = stdou
22320 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  t;.  }else if( s
22330 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74  trcmp(zFile, "st
22340 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  derr")==0 ){.   
22350 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d   f = stderr;.  }
22360 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
22370 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30  zFile, "off")==0
22380 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20   ){.    f = 0;. 
22390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20   }else{.    f = 
223a0 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65  fopen(zFile, bTe
223b0 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20 22  xtMode ? "w" : "
223c0 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d  wb");.    if( f=
223d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
223e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
223f0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
22400 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
22410 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
22420 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a  .  return f;.}..
22430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22440 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
22450 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
22460 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
22470 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
22480 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
22490 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c  t sql_trace_call
224a0 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64  back(.  unsigned
224b0 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   mType,         
224c0 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79 70  /* The trace typ
224d0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  e */.  void *pAr
224e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g,             /
224f0 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74 65  * The ShellState
22500 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f   pointer */.  vo
22510 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20 20  id *pP,         
22520 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c 79        /* Usually
22530 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 71   a pointer to sq
22540 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20 76  lite_stmt */.  v
22550 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20 20  oid *pX         
22560 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c 69         /* Auxili
22570 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b  ary output */.){
22580 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
22590 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
225a0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
225b0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
225c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
225d0 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20 69  .  int nSql;.  i
225e0 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d  f( p->traceOut==
225f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22600 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49 54  if( mType==SQLIT
22610 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b  E_TRACE_CLOSE ){
22620 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
22630 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 2d  (p->traceOut, "-
22640 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61  - closing databa
22650 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22  se connection\n"
22660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
22670 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70 65  .  }.  if( mType
22680 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52  !=SQLITE_TRACE_R
22690 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63 68  OW && ((const ch
226a0 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27 20  ar*)pX)[0]=='-' 
226b0 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28 63  ){.    zSql = (c
226c0 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20  onst char*)pX;. 
226d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d   }else{.    pStm
226e0 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
226f0 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74 63  t*)pP;.    switc
22700 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70 65  h( p->eTraceType
22710 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
22720 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e  HELL_TRACE_EXPAN
22730 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  DED: {.        z
22740 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Sql = sqlite3_ex
22750 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74  panded_sql(pStmt
22760 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
22770 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
22780 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
22790 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 63  ORMALIZE.      c
227a0 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f  ase SHELL_TRACE_
227b0 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  NORMALIZED: {.  
227c0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
227d0 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f  ite3_normalized_
227e0 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
227f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22800 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22810 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
22820 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
22830 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
22840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22850 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22860 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
22870 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c 20  eturn 0;.  nSql 
22880 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
22890 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c 3e  ;.  while( nSql>
228a0 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31  0 && zSql[nSql-1
228b0 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d  ]==';' ){ nSql--
228c0 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d 54  ; }.  switch( mT
228d0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
228e0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
228f0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
22900 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a  E_TRACE_STMT: {.
22910 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
22920 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
22930 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20  %.*s;\n", nSql, 
22940 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  zSql);.      bre
22950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22960 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
22970 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  PROFILE: {.     
22980 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
22990 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c 69  Nanosec = *(sqli
229a0 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a 20  te3_int64*)pX;. 
229b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
229c0 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25  (p->traceOut, "%
229d0 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c  .*s; -- %lld ns\
229e0 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20  n", nSql, zSql, 
229f0 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20 20  nNanosec);.     
22a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22a10 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
22a30 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
22a40 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
22a50 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
22a60 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
22a70 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
22a80 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
22a90 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
22aa0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
22ab0 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
22ac0 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
22ad0 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
22ae0 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
22af0 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
22b00 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
22b10 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c  SV and other fil
22b20 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a  es for import..*
22b30 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
22b40 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72   ImportCtx Impor
22b50 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70  tCtx;.struct Imp
22b60 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74  ortCtx {.  const
22b70 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f   char *zFile;  /
22b80 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
22b90 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49  put file */.  FI
22ba0 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
22bb0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53    /* Read the CS
22bc0 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73  V text from this
22bd0 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
22be0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
22bf0 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
22c00 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61  lated text for a
22c10 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
22c20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
22c30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22c40 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74  es in z */.  int
22c50 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
22c60 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
22c70 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20  ted for z[] */. 
22c80 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
22c90 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
22ca0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
22cb0 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20   int bNotFirst; 
22cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22cd0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  one or more byte
22ce0 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a  s already read *
22cf0 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
22d00 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
22d10 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
22d20 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
22d30 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
22d40 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20  int cColSep;    
22d50 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
22d60 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
22d70 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79  acter.  (Usually
22d80 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63   ",") */.  int c
22d90 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f  RowSep;        /
22da0 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61  * The row separa
22db0 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20  tor character.  
22dc0 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a  (Usually "\n") *
22dd0 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
22de0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
22df0 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
22e00 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e  oid import_appen
22e10 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78  d_char(ImportCtx
22e20 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69   *p, int c){.  i
22e30 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41  f( p->n+1>=p->nA
22e40 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
22e50 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c  Alloc += p->nAll
22e60 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d  oc + 100;.    p-
22e70 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  >z = sqlite3_rea
22e80 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e  lloc64(p->z, p->
22e90 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
22ea0 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c   p->z==0 ) shell
22eb0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
22ec0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  ;.  }.  p->z[p->
22ed0 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  n++] = (char)c;.
22ee0 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
22ef0 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56  gle field of CSV
22f00 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62   text.  Compatib
22f10 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30 20  le with rfc4180 
22f20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20  and extended.** 
22f30 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20  with the option 
22f40 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70 61  of having a sepa
22f50 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
22f60 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20   ","..**.**   + 
22f70 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
22f80 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
22f90 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
22fa0 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
22fb0 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
22fc0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
22fd0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
22fe0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
22ff0 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
23000 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
23010 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
23020 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
23030 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ,"..**   +  Use 
23040 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
23050 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
23060 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
23070 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70  n"..**   +  Keep
23080 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
23090 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ne number in p->
230a0 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
230b0 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
230c0 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
230d0 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
230e0 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
230f0 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
23100 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
23110 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
23120 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
23130 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
23140 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
23150 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
23160 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
23170 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
23180 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
23190 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
231a0 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
231b0 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
231c0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
231d0 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
231e0 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
231f0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
23200 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
23210 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22  .  }.  if( c=='"
23220 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c  ' ){.    int pc,
23230 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74   ppc;.    int st
23240 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
23250 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
23260 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
23270 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
23280 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
23290 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
232a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72  ;.      if( c==r
232b0 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  Sep ) p->nLine++
232c0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
232d0 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
232e0 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
232f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
23300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
23310 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23320 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23330 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
23340 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
23350 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
23360 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
23370 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65        || (c==rSe
23380 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  p && pc=='\r' &&
23390 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
233a0 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
233b0 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
233c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
233d0 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
233e0 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
233f0 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
23400 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
23410 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23430 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
23440 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
23450 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
23460 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
23470 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61  escaped %c chara
23480 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  cter\n",.       
23490 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c           p->zFil
234a0 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75  e, p->nLine, cQu
234b0 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ote);.      }.  
234c0 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29      if( c==EOF )
234d0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
234e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
234f0 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74  s:%d: unterminat
23500 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65  ed %c-quoted fie
23510 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
23520 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
23530 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f   startLine, cQuo
23540 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  te);.        p->
23550 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
23560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23570 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  }.      import_a
23580 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
23590 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70 63  ;.      ppc = pc
235a0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a  ;.      pc = c;.
235b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
235c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
235d0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
235e0 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e   being parsed an
235f0 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74 68  d it begins with
23600 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d   the.    ** UTF-
23610 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20  8 BOM  (0xEF BB 
23620 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  BF) then skip th
23630 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28  e BOM */.    if(
23640 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20   (c&0xff)==0xef 
23650 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d  && p->bNotFirst=
23660 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  =0 ){.      impo
23670 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
23680 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
23690 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
236a0 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
236b0 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20  ==0xbb ){.      
236c0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
236d0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
236e0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
236f0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >in);.        if
23700 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66  ( (c&0xff)==0xbf
23710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
23720 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
23730 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d            p->n =
23740 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
23750 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e  turn csv_read_on
23760 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20  e_field(p);.    
23770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23780 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63    }.    while( c
23790 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70  !=EOF && c!=cSep
237a0 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20   && c!=rSep ){. 
237b0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
237c0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
237d0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
237e0 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->in);.    }.   
237f0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
23800 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b        p->nLine++
23810 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
23820 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d  >0 && p->z[p->n-
23830 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d  1]=='\r' ) p->n-
23840 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  -;.    }.    p->
23850 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20  cTerm = c;.  }. 
23860 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a   if( p->z ) p->z
23870 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d  [p->n] = 0;.  p-
23880 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
23890 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
238a0 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
238b0 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49  le field of ASCI
238c0 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74  I delimited text
238d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
238e0 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
238f0 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
23900 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
23910 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
23920 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
23930 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
23940 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
23950 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
23960 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
23970 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
23980 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
23990 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46  default is "\x1F
239a0 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
239b0 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
239c0 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
239d0 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78  e default is "\x
239e0 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  1E"..**   +  Kee
239f0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72  p track of the r
23a00 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ow number in p->
23a10 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
23a20 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
23a30 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
23a40 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
23a50 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
23a60 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
23a70 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
23a80 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
23a90 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
23aa0 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
23ab0 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
23ac0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
23ad0 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20  field(ImportCtx 
23ae0 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *p){.  int c;.  
23af0 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43  int cSep = p->cC
23b00 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65  olSep;.  int rSe
23b10 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a  p = p->cRowSep;.
23b20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20    p->n = 0;.  c 
23b30 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
23b40 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20    if( c==EOF || 
23b50 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
23b60 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
23b70 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EOF;.    return 
23b80 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
23b90 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
23ba0 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
23bb0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
23bc0 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
23bd0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
23be0 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  n);.  }.  if( c=
23bf0 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e  =rSep ){.    p->
23c00 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70  nLine++;.  }.  p
23c10 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69  ->cTerm = c;.  i
23c20 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
23c30 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  ->n] = 0;.  retu
23c40 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn p->z;.}../*.*
23c50 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
23c60 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  r data for table
23c70 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20   zTable.  If an 
23c80 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68  error is seen wh
23c90 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f  ile.** moving fo
23ca0 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f  rward, try to go
23cb0 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65   backwards.  The
23cc0 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d   backwards movem
23cd0 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72  ent won't.** wor
23ce0 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  k for WITHOUT RO
23cf0 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  WID tables..*/.s
23d00 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
23d10 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65  CloneData(.  She
23d20 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
23d30 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
23d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
23d50 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  le.){.  sqlite3_
23d60 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
23d70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
23d80 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
23d90 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
23da0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
23db0 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
23dc0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
23dd0 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
23de0 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29  strlen30(zTable)
23df0 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20  ;.  int k = 0;. 
23e00 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
23e10 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61  const int spinRa
23e20 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a  te = 10000;..  z
23e30 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
23e40 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
23e50 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20  * FROM \"%w\"", 
23e60 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20  zTable);.  rc = 
23e70 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
23e80 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
23e90 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
23ea0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23eb0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
23ec0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64  tderr, "Error %d
23ed0 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  : %s on [%s]\n",
23ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23ef0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
23f00 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
23f10 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
23f20 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
23f30 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f   zQuery);.    go
23f40 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  to end_data_xfer
23f50 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69  ;.  }.  n = sqli
23f60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
23f70 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73  (pQuery);.  zIns
23f80 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ert = sqlite3_ma
23f90 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61  lloc64(200 + nTa
23fa0 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66  ble + n*3);.  if
23fb0 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73  ( zInsert==0 ) s
23fc0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
23fd0 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ry();.  sqlite3_
23fe0 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61  snprintf(200+nTa
23ff0 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20  ble,zInsert,.   
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
24020 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41  E INTO \"%s\" VA
24030 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29  LUES(?", zTable)
24040 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30  ;.  i = strlen30
24050 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72  (zInsert);.  for
24060 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=1; j<n; j++){
24070 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73  .    memcpy(zIns
24080 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b  ert+i, ",?", 2);
24090 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d  .    i += 2;.  }
240a0 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72  .  memcpy(zInser
240b0 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20  t+i, ");", 3);. 
240c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
240d0 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20  epare_v2(newDb, 
240e0 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49  zInsert, -1, &pI
240f0 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28  nsert, 0);.  if(
24100 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
24110 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24120 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20  Error %d: %s on 
24130 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
24140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74       sqlite3_ext
24150 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65  ended_errcode(ne
24160 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  wDb), sqlite3_er
24170 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20  rmsg(newDb),.   
24180 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
24190 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64  ;.    goto end_d
241a0 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ata_xfer;.  }.  
241b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b  for(k=0; k<2; k+
241c0 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +){.    while( (
241d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
241e0 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
241f0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
24200 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
24210 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74  +){.        swit
24220 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
24230 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20  mn_type(pQuery, 
24240 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i) ){.          
24250 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
24260 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
24270 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
24280 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b  l(pInsert, i+1);
24290 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
242a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
242b0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
242c0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
242d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
242e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
242f0 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
24300 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
24310 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20  64(pQuery,i));. 
24320 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
24330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24340 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
24350 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
24360 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24370 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e  _bind_double(pIn
24380 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
24390 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
243a0 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
243b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
243c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
243d0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
243e0 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20  E_TEXT: {.      
243f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24400 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c  nd_text(pInsert,
24410 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20   i+1,.          
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29     (const char*)
24440 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24450 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  ext(pQuery,i),. 
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
24480 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
24490 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
244a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
244b0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
244c0 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
244d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
244e0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65  _bind_blob(pInse
244f0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
24500 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75  _column_blob(pQu
24510 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
24550 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c  mn_bytes(pQuery,
24560 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
245a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
245b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
245c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
245d0 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20   /* End for */. 
245e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
245f0 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b  3_step(pInsert);
24600 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
24610 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
24620 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63  SQLITE_ROW && rc
24630 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  !=SQLITE_DONE ){
24640 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
24650 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
24660 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73  ror %d: %s\n", s
24670 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
24680 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a  errcode(newDb),.
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
246b0 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a  errmsg(newDb));.
246c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
246d0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73  lite3_reset(pIns
246e0 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b  ert);.      cnt+
246f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e  +;.      if( (cn
24700 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29  t%spinRate)==0 )
24710 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
24720 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22  ("%c\b", "|/-\\"
24730 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25  [(cnt/spinRate)%
24740 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c  4]);.        ffl
24750 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
24760 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e     }.    } /* En
24770 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69  d while */.    i
24780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
24790 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  NE ) break;.    
247a0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
247b0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
247c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
247d0 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
247e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
247f0 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
24800 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20  \"%w\" ORDER BY 
24810 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20  rowid DESC;",.  
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c             zTabl
24840 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
24850 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
24860 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
24870 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
24880 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24890 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
248a0 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67  stderr, "Warning
248b0 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22  : cannot step \"
248c0 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c  %s\" backwards",
248d0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
248e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
248f0 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e   /* End for(k=0.
24900 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61  ..) */..end_data
24910 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33  _xfer:.  sqlite3
24920 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
24930 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
24940 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a  alize(pInsert);.
24950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24960 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65  Query);.  sqlite
24970 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b  3_free(zInsert);
24980 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
24990 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72  o transfer all r
249a0 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d  ows of the schem
249b0 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68  a that match zWh
249c0 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63  ere.  For.** eac
249d0 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46  h row, invoke xF
249e0 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20  orEach() on the 
249f0 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62  object defined b
24a00 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49  y that row..** I
24a10 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
24a20 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
24a30 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74  moving forward t
24a40 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71  hrough the.** sq
24a50 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
24a60 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76  e, try again mov
24a70 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a  ing backwards..*
24a80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
24a90 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a  yToCloneSchema(.
24aa0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
24ab0 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
24ac0 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
24ad0 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20  *zWhere,.  void 
24ae0 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c  (*xForEach)(Shel
24af0 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a  lState*,sqlite3*
24b00 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
24b10 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24b20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63  *pQuery = 0;.  c
24b30 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
24b40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
24b50 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
24b60 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74   *zName;.  const
24b70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
24b80 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zSql;.  char *zE
24b90 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51  rrMsg = 0;..  zQ
24ba0 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
24bb0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e  printf("SELECT n
24bc0 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ame, sql FROM sq
24bd0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
24c00 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  %s", zWhere);.  
24c10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
24c20 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
24c30 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
24c40 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
24c50 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
24c60 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
24c70 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
24c80 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
24c90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24ca0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
24cb0 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
24cc0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
24cd0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
24ce0 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
24cf0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63  .    goto end_sc
24d00 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  hema_xfer;.  }. 
24d10 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
24d20 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
24d30 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
24d40 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
24d50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
24d60 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  xt(pQuery, 0);. 
24d70 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
24d80 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
24d90 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72  uery, 1);.    pr
24da0 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
24db0 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
24dc0 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  dout);.    sqlit
24dd0 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28  e3_exec(newDb, (
24de0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c  const char*)zSql
24df0 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
24e00 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
24e10 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
24e20 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24e30 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a  "Error: %s\nSQL:
24e40 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73   [%s]\n", zErrMs
24e50 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  g, zSql);.      
24e60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
24e70 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72  rMsg);.      zEr
24e80 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rMsg = 0;.    }.
24e90 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68      if( xForEach
24ea0 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61   ){.      xForEa
24eb0 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
24ec0 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
24ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
24ee0 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20  tf("done\n");.  
24ef0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
24f00 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73  TE_DONE ){.    s
24f10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
24f20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
24f30 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
24f40 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20  );.    zQuery = 
24f50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
24f60 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
24f70 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24f80 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f 52     " WHERE %s OR
24fb0 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
24fc0 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  C", zWhere);.   
24fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
24fe0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
24ff0 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
25000 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ery, 0);.    if(
25010 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
25020 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
25030 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
25040 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
25070 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
25080 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
25090 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20   zQuery);.      
250c0 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
250d0 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xfer;.    }.    
250e0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
250f0 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79  ite3_step(pQuery
25100 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ))==SQLITE_ROW )
25110 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
25120 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
25130 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
25140 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
25150 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
25160 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20  (pQuery, 1);.   
25170 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
25180 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
25190 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
251a0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
251b0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
251c0 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  r*)zSql, 0, 0, &
251d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
251e0 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
251f0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
25200 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
25210 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
25220 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
25230 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ql);.        sql
25240 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
25250 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  g);.        zErr
25260 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Msg = 0;.      }
25270 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72 45  .      if( xForE
25280 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ach ){.        x
25290 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62  ForEach(p, newDb
252a0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
252b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
252c0 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e       printf("don
252d0 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e\n");.    }.  }
252e0 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72  .end_schema_xfer
252f0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
25300 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
25310 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
25320 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ery);.}../*.** O
25330 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
25340 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a  se file named "z
25350 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20  NewDb".  Try to 
25360 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20  recover as much 
25370 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61  information.** a
25380 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f  s possible out o
25390 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
253a0 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68 74  ase (which might
253b0 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64   be corrupt) and
253c0 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74   write it.** int
253d0 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61  o zNewDb..*/.sta
253e0 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
253f0 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  one(ShellState *
25400 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
25410 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63  NewDb){.  int rc
25420 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ;.  sqlite3 *new
25430 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63  Db = 0;.  if( ac
25440 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d  cess(zNewDb,0)==
25450 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
25460 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69  intf(stderr, "Fi
25470 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  le \"%s\" alread
25480 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e  y exists.\n", zN
25490 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72  ewDb);.    retur
254a0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  n;.  }.  rc = sq
254b0 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44  lite3_open(zNewD
254c0 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66  b, &newDb);.  if
254d0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
254e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
254f0 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f  "Cannot create o
25500 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a 20  utput database: 
25510 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
25520 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
25530 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c  g(newDb));.  }el
25540 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
25550 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
25560 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
25570 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20  ema=ON;", 0, 0, 
25580 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
25590 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47  exec(newDb, "BEG
255a0 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20  IN EXCLUSIVE;", 
255b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72  0, 0, 0);.    tr
255c0 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70  yToCloneSchema(p
255d0 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27  , newDb, "type='
255e0 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c  table'", tryToCl
255f0 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72  oneData);.    tr
25600 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70  yToCloneSchema(p
25610 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d  , newDb, "type!=
25620 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20  'table'", 0);.  
25630 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
25640 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c  ewDb, "COMMIT;",
25650 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
25660 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
25670 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
25680 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
25690 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
256a0 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62    close_db(newDb
256b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
256c0 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
256d0 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
256e0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
256f0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61  p->doXdgOpen fla
25700 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d  g is set, that m
25710 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20  eans the output 
25720 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64  was being.** red
25730 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d  irected to a tem
25740 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
25750 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  d by p->zTempFil
25760 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
25770 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72  ,.** launch star
25780 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
25790 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
257a0 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  y file..*/.stati
257b0 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
257c0 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
257d0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
257e0 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
257f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25800 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
25810 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
25820 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
25830 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
25840 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66  ose(p->out);.#if
25850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
25860 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
25870 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
25880 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
25890 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20  ar *zXdgOpenCmd 
258a0 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  =.#if defined(_W
258b0 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74 61  IN32).      "sta
258c0 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  rt";.#elif defin
258d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
258e0 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73      "open";.#els
258f0 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65  e.      "xdg-ope
25900 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  n";.#endif.     
25910 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
25920 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
25930 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73  3_mprintf("%s %s
25940 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20  ", zXdgOpenCmd, 
25950 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
25960 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d 28       if( system(
25970 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20  zCmd) ){.       
25980 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25990 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25  err, "Failed: [%
259a0 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20  s]\n", zCmd);.  
259b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
259c0 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
259d0 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
259e0 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  Pop(p);.      p-
259f0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a  >doXdgOpen = 0;.
25a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
25a10 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 7d 0a  eep(100);.    }.
25a20 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
25a30 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ed(SQLITE_NOHAVE
25a40 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a  _SYSTEM) */.  }.
25a50 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20    p->outfile[0] 
25a60 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20  = 0;.  p->out = 
25a70 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stdout;.}../*.**
25a80 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d   Run an SQL comm
25a90 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74  and and return t
25aa0 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65  he single intege
25ab0 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  r result..*/.sta
25ac0 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53  tic int db_int(S
25ad0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
25ae0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
25af0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
25b00 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65  *pStmt;.  int re
25b10 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  s = 0;.  sqlite3
25b20 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
25b30 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
25b40 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  tmt, 0);.  if( p
25b50 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f  Stmt && sqlite3_
25b60 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
25b70 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72  ITE_ROW ){.    r
25b80 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
25b90 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29  umn_int(pStmt,0)
25ba0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
25bb0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
25bc0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
25bd0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
25be0 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79  a 2-byte or 4-by
25bf0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
25c00 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74  teger into a nat
25c10 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73  ive integer.*/.s
25c20 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
25c30 6e 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75  nt get2byteInt(u
25c40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29  nsigned char *a)
25c50 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d  {.  return (a[0]
25c60 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73  <<8) + a[1];.}.s
25c70 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
25c80 6e 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75  nt get4byteInt(u
25c90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29  nsigned char *a)
25ca0 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d  {.  return (a[0]
25cb0 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31  <<24) + (a[1]<<1
25cc0 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b  6) + (a[2]<<8) +
25cd0 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   a[3];.}../*.** 
25ce0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25cf0 66 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f  f the ".info" co
25d00 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  mmand..**.** Ret
25d10 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20  urn 1 on error, 
25d20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30  2 to exit, and 0
25d30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
25d40 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
25d50 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53  dbinfo_command(S
25d60 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
25d70 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
25d80 7a 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20  zArg){.  static 
25d90 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
25da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
25db0 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46  ; int ofst; } aF
25dc0 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ield[] = {.     
25dd0 7b 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63  { "file change c
25de0 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d  ounter:",  24  }
25df0 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61  ,.     { "databa
25e00 73 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c  se page count:",
25e10 20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    28  },.     { 
25e20 22 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63  "freelist page c
25e30 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a  ount:",  36  },.
25e40 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63       { "schema c
25e50 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20  ookie:",        
25e60 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  40  },.     { "s
25e70 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20  chema format:", 
25e80 20 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20         44  },.  
25e90 20 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61     { "default ca
25ea0 63 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38  che size:",   48
25eb0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74    },.     { "aut
25ec0 6f 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74  ovacuum top root
25ed0 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20  :",  52  },.    
25ee0 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20   { "incremental 
25ef0 76 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20  vacuum:",   64  
25f00 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20  },.     { "text 
25f10 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20  encoding:",     
25f20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b     56  },.     {
25f30 20 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22   "user version:"
25f40 2c 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c  ,         60  },
25f50 0a 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61  .     { "applica
25f60 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20  tion id:",      
25f70 20 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   68  },.     { "
25f80 73 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e  software version
25f90 3a 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20  :",     96  },. 
25fa0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
25fb0 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73  st struct { cons
25fc0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63  t char *zName; c
25fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
25fe0 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a   } aQuery[] = {.
25ff0 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f       { "number o
26000 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20  f tables:",.    
26010 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
26020 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
26030 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20  E type='table'" 
26040 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65  },.     { "numbe
26050 72 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a  r of indexes:",.
26060 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
26070 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
26080 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
26090 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  x'" },.     { "n
260a0 75 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72  umber of trigger
260b0 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
260c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
260d0 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
260e0 27 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20  'trigger'" },.  
260f0 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
26100 76 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20  views:",.       
26110 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
26120 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
26130 79 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20  ype='view'" },. 
26140 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69      { "schema si
26150 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  ze:",.       "SE
26160 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74  LECT total(lengt
26170 68 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22  h(sql)) FROM %s"
26180 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
26190 2c 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  , rc;.  unsigned
261a0 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20   iDataVersion;. 
261b0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61   char *zSchemaTa
261c0 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  b;.  char *zDb =
261d0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
261e0 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] : "main";.  
261f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
26200 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  tmt = 0;.  unsig
26210 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
26220 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0];.  open_db(p,
26230 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62   0);.  if( p->db
26240 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
26250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
26260 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
26270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53  .             "S
26280 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20  ELECT data FROM 
26290 73 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31  sqlite_dbpage(?1
262a0 29 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c  ) WHERE pgno=1",
262b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  .             -1
262c0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
262d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
262e0 28 20 21 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  ( !sqlite3_compi
262f0 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 22 45  leoption_used("E
26300 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41  NABLE_DBPAGE_VTA
26310 42 22 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  B") ){.      utf
26320 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
26330 20 22 74 68 65 20 5c 22 2e 64 62 69 6e 66 6f 5c   "the \".dbinfo\
26340 22 20 63 6f 6d 6d 61 6e 64 20 72 65 71 75 69 72  " command requir
26350 65 73 20 74 68 65 20 22 0a 20 20 20 20 20 20 20  es the ".       
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 22 2d 44 53 51 4c 49 54 45 5f 45 4e 41     "-DSQLITE_ENA
26380 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 20  BLE_DBPAGE_VTAB 
26390 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
263a0 69 6f 6e 73 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  ions\n");.    }e
263b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
263c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
263d0 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
263e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
263f0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  db));.    }.    
26400 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26410 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74  (pStmt);.    ret
26420 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 1;.  }.  sql
26430 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
26440 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31  Stmt, 1, zDb, -1
26450 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
26460 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
26470 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
26480 49 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71  ITE_ROW.   && sq
26490 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
264a0 65 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a  es(pStmt,0)>100.
264b0 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
264c0 61 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f  aHdr, sqlite3_co
264d0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
264e0 30 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71  0), 100);.    sq
264f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
26500 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Stmt);.  }else{.
26510 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
26520 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74  tderr, "unable t
26530 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
26540 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20  header\n");.    
26550 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26560 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74  (pStmt);.    ret
26570 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d  urn 1;.  }.  i =
26580 20 67 65 74 32 62 79 74 65 49 6e 74 28 61 48 64   get2byteInt(aHd
26590 72 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d  r+16);.  if( i==
265a0 31 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20  1 ) i = 65536;. 
265b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
265c0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
265d0 22 2c 20 22 64 61 74 61 62 61 73 65 20 70 61 67  ", "database pag
265e0 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20  e size:", i);.  
265f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26600 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
26610 2c 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a  , "write format:
26620 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20  ", aHdr[18]);.  
26630 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26640 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
26650 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22  , "read format:"
26660 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75  , aHdr[19]);.  u
26670 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
26680 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
26690 20 22 72 65 73 65 72 76 65 64 20 62 79 74 65 73   "reserved bytes
266a0 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20  :", aHdr[20]);. 
266b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
266c0 79 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69  ySize(aField); i
266d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
266e0 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66  t = aField[i].of
266f0 73 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  st;.    unsigned
26700 20 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62   int val = get4b
26710 79 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66  yteInt(aHdr + of
26720 73 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  st);.    utf8_pr
26730 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
26740 32 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b  20s %u", aField[
26750 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
26760 20 20 20 20 73 77 69 74 63 68 28 20 6f 66 73 74      switch( ofst
26770 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35   ){.      case 5
26780 36 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  6: {.        if(
26790 20 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72   val==1 ) raw_pr
267a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28  intf(p->out, " (
267b0 75 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20  utf8)");.       
267c0 20 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61   if( val==2 ) ra
267d0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
267e0 20 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a   " (utf16le)");.
267f0 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
26800 3d 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =3 ) raw_printf(
26810 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
26820 62 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  be)");.      }. 
26830 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
26840 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
26850 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62  );.  }.  if( zDb
26860 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
26870 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
26880 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71  mprintf("main.sq
26890 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20  lite_master");. 
268a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
268b0 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30  p(zDb,"temp")==0
268c0 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54   ){.    zSchemaT
268d0 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
268e0 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69  intf("%s", "sqli
268f0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
26900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
26910 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
26920 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
26930 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  w\".sqlite_maste
26940 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  r", zDb);.  }.  
26950 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
26960 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b  Size(aQuery); i+
26970 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
26980 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
26990 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a  intf(aQuery[i].z
269a0 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29  Sql, zSchemaTab)
269b0 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20  ;.    int val = 
269c0 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b  db_int(p, zSql);
269d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
269e0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66  e(zSql);.    utf
269f0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26a00 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61   "%-20s %d\n", a
26a10 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Query[i].zName, 
26a20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  val);.  }.  sqli
26a30 74 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61  te3_free(zSchema
26a40 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Tab);.  sqlite3_
26a50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
26a60 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
26a70 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49  FCNTL_DATA_VERSI
26a80 4f 4e 2c 20 26 69 44 61 74 61 56 65 72 73 69 6f  ON, &iDataVersio
26a90 6e 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  n);.  utf8_print
26aa0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
26ab0 20 25 75 5c 6e 22 2c 20 22 64 61 74 61 20 76 65   %u\n", "data ve
26ac0 72 73 69 6f 6e 22 2c 20 69 44 61 74 61 56 65 72  rsion", iDataVer
26ad0 73 69 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  sion);.  return 
26ae0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0;.}../*.** Prin
26af0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  t the current sq
26b00 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76  lite3_errmsg() v
26b10 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20 61  alue to stderr a
26b20 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  nd return 1..*/.
26b30 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
26b40 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 73 71  DatabaseError(sq
26b50 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
26b60 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
26b70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26b80 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  db);.  utf8_prin
26b90 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
26ba0 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  r: %s\n", zErr);
26bb0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
26bc0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
26bd0 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c  e pattern in zGl
26be0 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65  ob[] against the
26bf0 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52   text in z[].  R
26c00 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66  eturn TRUE.** if
26c10 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20   they match and 
26c20 46 41 4c 53 45 20 28 30 29 20 69 66 20 74 68 65  FALSE (0) if the
26c30 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  y do not match..
26c40 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72  **.** Globbing r
26c50 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ules:.**.**     
26c60 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68   '*'       Match
26c70 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
26c80 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
26c90 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
26ca0 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20  *      '?'      
26cb0 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79   Matches exactly
26cc0 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a   one character..
26cd0 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20  **.**     [...] 
26ce0 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65       Matches one
26cf0 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20   character from 
26d00 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
26d10 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
26d20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72         character
26d30 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e  s..**.**     [^.
26d40 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20  ..]     Matches 
26d50 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f  one character no
26d60 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65  t in the enclose
26d70 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  d list..**.**   
26d80 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 74     '#'       Mat
26d90 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
26da0 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e of one or more
26db0 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a   digits with an.
26dc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
26dd0 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20    optional + or 
26de0 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a  - sign in front.
26df0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20  **.**      ' '  
26e00 20 20 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66       Any span of
26e10 20 77 68 69 74 65 73 70 61 63 65 20 6d 61 74 63   whitespace matc
26e20 68 65 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70  hes any other sp
26e30 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  an of.**        
26e40 20 20 20 20 20 20 20 20 77 68 69 74 65 73 70 61          whitespa
26e50 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20  ce..**.** Extra 
26e60 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68  whitespace at th
26e70 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20  e end of z[] is 
26e80 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  ignored..*/.stat
26e90 69 63 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f  ic int testcase_
26ea0 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20  glob(const char 
26eb0 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68  *zGlob, const ch
26ec0 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c  ar *z){.  int c,
26ed0 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72   c2;.  int inver
26ee0 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a  t;.  int seen;..
26ef0 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a    while( (c = (*
26f00 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29  (zGlob++)))!=0 )
26f10 7b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  {.    if( IsSpac
26f20 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66  e(c) ){.      if
26f30 28 20 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29  ( !IsSpace(*z) )
26f40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
26f50 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
26f60 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b  *zGlob) ) zGlob+
26f70 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
26f80 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  IsSpace(*z) ) z+
26f90 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
26fa0 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20   c=='*' ){.     
26fb0 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47   while( (c=(*(zG
26fc0 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20  lob++))) == '*' 
26fd0 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  || c=='?' ){.   
26fe0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20       if( c=='?' 
26ff0 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29  && (*(z++))==0 )
27000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
27010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
27020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
27030 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
27040 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
27050 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
27060 2a 7a 20 26 26 20 74 65 73 74 63 61 73 65 5f 67  *z && testcase_g
27070 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d  lob(zGlob-1,z)==
27080 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
27090 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
270a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a        return (*z
270b0 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )!=0;.      }.  
270c0 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d      while( (c2 =
270d0 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b   (*(z++)))!=0 ){
270e0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
270f0 63 32 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20  c2!=c ){.       
27100 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a     c2 = *(z++);.
27110 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32            if( c2
27120 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
27130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27140 20 20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67    if( testcase_g
27150 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72  lob(zGlob,z) ) r
27160 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
27170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
27180 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
27190 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='?' ){.      i
271a0 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29  f( (*(z++))==0 )
271b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
271c0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
271d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  ){.      int pri
271e0 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
271f0 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  seen = 0;.      
27200 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  invert = 0;.    
27210 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20    c = *(z++);.  
27220 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
27230 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
27240 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
27250 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e        if( c2=='^
27260 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  ' ){.        inv
27270 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ert = 1;.       
27280 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
27290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
272a0 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20  if( c2==']' ){. 
272b0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
272c0 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  ' ) seen = 1;.  
272d0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
272e0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
272f0 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26       while( c2 &
27300 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
27310 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27       if( c2=='-'
27320 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d   && zGlob[0]!=']
27330 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30  ' && zGlob[0]!=0
27340 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b   && prior_c>0 ){
27350 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
27360 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
27370 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
27380 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
27390 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
273a0 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b      prior_c = 0;
273b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
273c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
273d0 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =c2 ){.         
273e0 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20     seen = 1;.   
273f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27400 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b     prior_c = c2;
27410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27420 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
27430 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
27440 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
27450 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
27460 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
27470 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
27480 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  #' ){.      if( 
27490 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]=='-' || z[
274a0 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69  0]=='+') && IsDi
274b0 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b  git(z[1]) ) z++;
274c0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 44 69  .      if( !IsDi
274d0 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75  git(z[0]) ) retu
274e0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  rn 0;.      z++;
274f0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
27500 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a  Digit(z[0]) ){ z
27510 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b  ++; }.    }else{
27520 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a  .      if( c!=(*
27530 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20  (z++)) ) return 
27540 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  0;.    }.  }.  w
27550 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
27560 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65  ) ){ z++; }.  re
27570 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a  turn *z==0;.}...
27580 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
27590 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f  e string as a co
275a0 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
275b0 6e 20 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e  n with either on
275c0 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74  e or two.** init
275d0 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65  ial "-" characte
275e0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
275f0 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f  t optionMatch(co
27600 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
27610 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
27620 29 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  ){.  if( zStr[0]
27630 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30  !='-' ) return 0
27640 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66  ;.  zStr++;.  if
27650 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29  ( zStr[0]=='-' )
27660 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72   zStr++;.  retur
27670 6e 20 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a  n strcmp(zStr, z
27680 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Opt)==0;.}../*.*
27690 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e  * Delete a file.
276a0 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c  .*/.int shellDel
276b0 65 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eteFile(const ch
276c0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
276d0 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66    int rc;.#ifdef
276e0 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
276f0 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77  t *z = sqlite3_w
27700 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
27710 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
27720 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b  .  rc = _wunlink
27730 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (z);.  sqlite3_f
27740 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  ree(z);.#else.  
27750 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  rc = unlink(zFil
27760 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
27770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27780 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65  *.** Try to dele
27790 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
277a0 20 66 69 6c 65 20 28 69 66 20 74 68 65 72 65 20   file (if there 
277b0 69 73 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65  is one) and free
277c0 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75   the.** memory u
277d0 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  sed to hold the 
277e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70  name of the temp
277f0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
27800 20 76 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46   void clearTempF
27810 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ile(ShellState *
27820 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65  p){.  if( p->zTe
27830 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  mpFile==0 ) retu
27840 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58  rn;.  if( p->doX
27850 64 67 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b  dgOpen ) return;
27860 0a 20 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65  .  if( shellDele
27870 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46  teFile(p->zTempF
27880 69 6c 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ile) ) return;. 
27890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
278a0 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
278b0 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
278c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
278d0 20 61 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65   a new temp file
278e0 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67   name with the g
278f0 69 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a  iven suffix..*/.
27900 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54  static void newT
27910 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61  empFile(ShellSta
27920 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
27930 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63  r *zSuffix){.  c
27940 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b  learTempFile(p);
27950 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27960 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
27970 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
27980 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29  0;.  if( p->db )
27990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
279a0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
279b0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  , 0, SQLITE_FCNT
279c0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20  L_TEMPFILENAME, 
279d0 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  &p->zTempFile);.
279e0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
279f0 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
27a00 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
27a10 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  r;.    sqlite3_r
27a20 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
27a30 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d  (r), &r);.    p-
27a40 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c  >zTempFile = sql
27a50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65  ite3_mprintf("te
27a60 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a  mp%llx.%s", r, z
27a70 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65  Suffix);.  }else
27a80 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69  {.    p->zTempFi
27a90 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
27aa0 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d  intf("%z.%s", p-
27ab0 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66  >zTempFile, zSuf
27ac0 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fix);.  }.  if( 
27ad0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
27ae0 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
27af0 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
27b00 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
27b10 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d    exit(1);.  }.}
27b20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
27b30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53  lementation of S
27b40 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  QL scalar functi
27b50 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  on fkey_collate_
27b60 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a  clause(), used.*
27b70 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20  * by the ".lint 
27b80 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f  fkey-indexes" co
27b90 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c  mmand. This scal
27ba0 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ar function is a
27bb0 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  lways.** called 
27bc0 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65  with four argume
27bd0 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74  nts - the parent
27be0 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65   table name, the
27bf0 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e   parent column n
27c00 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c  ame,.** the chil
27c10 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  d table name and
27c20 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d   the child colum
27c30 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n name..**.**   
27c40 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
27c50 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27  use('parent-tab'
27c60 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20  , 'parent-col', 
27c70 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68  'child-tab', 'ch
27c80 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20  ild-col').**.** 
27c90 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
27ca0 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72   named tables or
27cb0 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20   columns do not 
27cc0 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63  exist, this func
27cd0 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
27ce0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
27cf0 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   An empty string
27d00 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
27d10 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73  d if both tables
27d20 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20  .** and columns 
27d30 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20 74  exist but have t
27d40 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20  he same default 
27d50 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
27d60 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f  ce. Or,.** if bo
27d70 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68 65  th exist but the
27d80 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
27d90 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  on sequences are
27da0 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73   different, this
27db0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
27dc0 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
27dd0 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e  " COLLATE <paren
27de0 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77  t-collation>", w
27df0 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d  here.** <parent-
27e00 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68  collation> is th
27e10 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
27e20 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
27e30 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
27e40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
27e50 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  d shellFkeyColla
27e60 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69  teClause(.  sqli
27e70 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
27e80 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
27e90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
27ea0 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69  *apVal.){.  sqli
27eb0 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
27ec0 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
27ed0 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e  dle(pCtx);.  con
27ee0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
27ef0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
27f00 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f  zParentCol;.  co
27f10 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
27f20 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tSeq;.  const ch
27f30 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f  ar *zChild;.  co
27f40 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
27f50 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col;.  const cha
27f60 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30  r *zChildSeq = 0
27f70 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
27f80 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d   to avoid false-
27f90 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67  positive warning
27fa0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
27fb0 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34   assert( nVal==4
27fc0 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20   );.  zParent = 
27fd0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27fe0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
27ff0 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61  apVal[0]);.  zPa
28000 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  rentCol = (const
28010 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
28020 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
28030 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20  1]);.  zChild = 
28040 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
28050 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
28060 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68  apVal[2]);.  zCh
28070 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20  ildCol = (const 
28080 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
28090 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33  lue_text(apVal[3
280a0 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72  ]);..  sqlite3_r
280b0 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
280c0 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f   "", -1, SQLITE_
280d0 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20  STATIC);.  rc = 
280e0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
280f0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
28100 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c       db, "main",
28110 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e   zParent, zParen
28120 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e  tCol, 0, &zParen
28130 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  tSeq, 0, 0, 0.  
28140 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
28160 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
28170 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
28180 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d  (.        db, "m
28190 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43  ain", zChild, zC
281a0 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68  hildCol, 0, &zCh
281b0 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a  ildSeq, 0, 0, 0.
281c0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
281d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
281e0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
281f0 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a  mp(zParentSeq, z
28200 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20  ChildSeq) ){.   
28210 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
28220 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c  e3_mprintf(" COL
28230 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e  LATE %s", zParen
28240 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74  tSeq);.    sqlit
28250 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
28260 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Ctx, z, -1, SQLI
28270 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
28280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28290 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  z);.  }.}.../*.*
282a0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
282b0 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d  tion of dot-comm
282c0 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d  and ".lint fkey-
282d0 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61  indexes"..*/.sta
282e0 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79  tic int lintFkey
282f0 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c  Indexes(.  Shell
28300 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
28310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
28320 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
28330 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
28340 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
28350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28360 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
28370 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
28380 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
28390 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283b0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
283c0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
283d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
283e0 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20   = pState->db;  
283f0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28400 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79   handle to query
28410 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f   "main" db of */
28420 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70  .  FILE *out = p
28430 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20  State->out;     
28440 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20     /* Stream to 
28450 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20  write non-error 
28460 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69  output to */.  i
28470 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b  nt bVerbose = 0;
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28490 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73  * If -verbose is
284a0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
284b0 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  t bGroupByParent
284c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
284d0 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65   If -groupbypare
284e0 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  nt is present */
284f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
28520 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d   through azArg[]
28530 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28540 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20   *zIndent = ""; 
28550 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
28560 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41  h to indent CREA
28570 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20  TE INDEX by */. 
28580 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
285b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
285c0 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20  t *pSql = 0;    
285d0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64       /* Compiled
285e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20   version of SQL 
285f0 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20  statement below 
28600 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  */..  /*.  ** Th
28610 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
28620 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20  ent returns one 
28630 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72  row for each for
28640 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
28650 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  int.  ** in the 
28660 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61  schema of the ma
28670 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  in database. The
28680 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
28690 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e  re:.  **.  ** 0.
286a0 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   The text of an 
286b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69  SQL statement si
286c0 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20  milar to:.  **. 
286d0 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49   **      "EXPLAI
286e0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
286f0 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64  ECT 1 FROM child
28700 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63 68 69  _table WHERE chi
28710 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20  ld_key=?".  **. 
28720 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45   **    This SELE
28730 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  CT is similar to
28740 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68   the one that th
28750 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69  e foreign keys i
28760 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
28770 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72  **    needs to r
28780 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e  un internally on
28790 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49   child tables. I
287a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  f there is an in
287b0 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  dex that can.  *
287c0 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f 20  *    be used to 
287d0 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75  optimize this qu
287e0 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ery, then it can
287f0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79   also be used by
28800 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20   the FK.  **    
28810 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
28820 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54  o optimize DELET
28830 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
28840 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
28850 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62  rent.  **    tab
28860 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e  le..  **.  ** 1.
28870 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20   A GLOB pattern 
28880 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c  suitable for sql
28890 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20  ite3_strglob(). 
288a0 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70  If the plan outp
288b0 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68  ut by.  **    th
288c0 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
288d0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74  PLAN command mat
288e0 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65 72  ches this patter
288f0 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68 65  n, then the sche
28900 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61  ma.  **    conta
28910 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ins an index tha
28920 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
28930 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75   optimize the qu
28940 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ery..  **.  ** 2
28950 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
28960 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
28970 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20 74  ibes the child t
28980 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
28990 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
289a0 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61         "child_ta
289b0 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20  ble(child_key1, 
289c0 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a  child_key2)".  *
289d0 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20  *.  ** 3. Human 
289e0 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
289f0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
28a00 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e   parent table an
28a10 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a  d columns. e.g..
28a20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
28a30 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61  "parent_table(pa
28a40 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e  rent_key1, paren
28a50 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20  t_key2)".  **.  
28a60 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45  ** 4. A full CRE
28a70 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
28a80 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
28a90 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75   that could be u
28aa0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f  sed to.  **    o
28ab0 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f  ptimize DELETE o
28ac0 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
28ad0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  nts on the paren
28ae0 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20  t table. e.g..  
28af0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43  **.  **       "C
28b00 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c  REATE INDEX chil
28b10 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65  d_table_child_ke
28b20 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65  y ON child_table
28b30 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a  (child_key)".  *
28b40 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61  *.  ** 5. The na
28b50 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  me of the parent
28b60 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
28b70 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c 75  * These six valu
28b80 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20 74  es are used by t
28b90 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77  he C logic below
28ba0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
28bb0 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20   report..  */.  
28bc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
28bd0 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20   =.  "SELECT ". 
28be0 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41 49     "     'EXPLAI
28bf0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
28c00 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20  ECT 1 FROM ' || 
28c10 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c  quote(s.name) ||
28c20 20 27 20 57 48 45 52 45 20 27 22 0a 20 20 20 20   ' WHERE '".    
28c30 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
28c40 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  at(quote(s.name)
28c50 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65   || '.' || quote
28c60 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d  (f.[from]) || '=
28c70 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66  ?' ".    "  || f
28c80 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
28c90 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
28ca0 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c   f.[table], COAL
28cb0 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
28cc0 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20  name]), s.name, 
28cd0 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20  f.[from]),' AND 
28ce0 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  ')".    ", ".   
28cf0 20 22 20 20 20 20 20 27 53 45 41 52 43 48 20 54   "     'SEARCH T
28d00 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65  ABLE ' || s.name
28d10 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45   || ' USING COVE
28d20 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20  RING INDEX*('". 
28d30 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
28d40 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41  oncat('*=?', ' A
28d50 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ND ') || ')'".  
28d60 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
28d70 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20   s.name  || '(' 
28d80 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28d90 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29  f.[from],  ', ')
28da0 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
28db0 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
28dc0 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20  able] || '(' || 
28dd0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41  group_concat(COA
28de0 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
28df0 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22  [name])) || ')'"
28e00 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
28e10 20 20 20 20 27 43 52 45 41 54 45 20 49 4e 44 45      'CREATE INDE
28e20 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  X ' || quote(s.n
28e30 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75  ame ||'_'|| grou
28e40 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d  p_concat(f.[from
28e50 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20  ], '_'))".    " 
28e60 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75   || ' ON ' || qu
28e70 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
28e80 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72  ('".    "  || gr
28e90 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65  oup_concat(quote
28ea0 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20  (f.[from]) ||". 
28eb0 20 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79     "        fkey
28ec0 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
28ed0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
28ee0 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c   f.[table], COAL
28ef0 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
28f00 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20  name]), s.name, 
28f10 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29  f.[from]), ', ')
28f20 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27  ".    "  || ');'
28f30 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
28f40 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22       f.[table] "
28f50 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74  .    "FROM sqlit
28f60 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70  e_master AS s, p
28f70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65  ragma_foreign_ke
28f80 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41  y_list(s.name) A
28f90 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20  S f ".    "LEFT 
28fa0 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c  JOIN pragma_tabl
28fb0 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28  e_info AS p ON (
28fc0 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61  pk-1=seq AND p.a
28fd0 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a  rg=f.[table]) ".
28fe0 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e      "GROUP BY s.
28ff0 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20  name, f.id ".   
29000 20 22 4f 52 44 45 52 20 42 59 20 28 43 41 53 45   "ORDER BY (CASE
29010 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b   WHEN ? THEN f.[
29020 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61  table] ELSE s.na
29030 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63  me END)".  ;.  c
29040 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
29050 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41  IPK = "SEARCH TA
29060 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45  BLE * USING INTE
29070 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
29080 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66  (rowid=?)";..  f
29090 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20  or(i=2; i<nArg; 
290a0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  i++){.    int n 
290b0 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
290c0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  [i]);.    if( n>
290d0 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  1 && sqlite3_str
290e0 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22  nicmp("-verbose"
290f0 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d  , azArg[i], n)==
29100 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62  0 ){.      bVerb
29110 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
29120 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20     else if( n>1 
29130 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
29140 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72  cmp("-groupbypar
29150 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  ent", azArg[i], 
29160 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  n)==0 ){.      b
29170 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20  GroupByParent = 
29180 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74  1;.      zIndent
29190 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d   = "    ";.    }
291a0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
291b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
291c0 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25  rr, "Usage: %s %
291d0 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67  s ?-verbose? ?-g
291e0 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22  roupbyparent?\n"
291f0 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72  ,.          azAr
29200 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20  g[0], azArg[1]. 
29210 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
29220 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29230 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
29240 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
29250 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
29260 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  use() SQL functi
29270 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  on */.  rc = sql
29280 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
29290 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63  tion(db, "fkey_c
292a0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20  ollate_clause", 
292b0 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  4, SQLITE_UTF8,.
292c0 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b        0, shellFk
292d0 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c  eyCollateClause,
292e0 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69   0, 0.  );...  i
292f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29300 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
29310 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
29320 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
29330 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Sql, 0);.  }.  i
29340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29350 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29360 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31  bind_int(pSql, 1
29370 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  , bGroupByParent
29380 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
29390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
293a0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
293b0 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b  char *zPrev = 0;
293c0 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
293d0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
293e0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
293f0 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31      int res = -1
29400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29410 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d  stmt *pExplain =
29420 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   0;.      const 
29430 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f  char *zEQP = (co
29440 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
29450 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
29460 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 0);.      co
29470 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20  nst char *zGlob 
29480 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
29490 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
294a0 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20  xt(pSql, 1);.   
294b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
294c0 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  From = (const ch
294d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
294e0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29  mn_text(pSql, 2)
294f0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
29500 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63  ar *zTarget = (c
29510 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
29520 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
29530 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63  Sql, 3);.      c
29540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d  onst char *zCI =
29550 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
29560 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
29570 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20  t(pSql, 4);.    
29580 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
29590 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
295a0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
295b0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35  umn_text(pSql, 5
295c0 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  );..      rc = s
295d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
295e0 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
295f0 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
29600 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29610 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
29620 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
29630 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
29640 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
29650 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
29660 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e  ar *zPlan = (con
29670 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
29680 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
29690 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20  plain, 3);.     
296a0 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20     res = (.     
296b0 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
296c0 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f  te3_strglob(zGlo
296d0 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  b, zPlan).      
296e0 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74       || 0==sqlit
296f0 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62  e3_strglob(zGlob
29700 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20  IPK, zPlan).    
29710 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
29720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29730 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
29740 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ain);.      if( 
29750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29760 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66  break;..      if
29770 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
29780 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29790 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e  derr, "Error: in
297a0 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a  ternal error");.
297b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
297c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
297d0 20 20 20 20 69 66 28 20 62 47 72 6f 75 70 42 79      if( bGroupBy
297e0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26  Parent.        &
297f0 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72  & (bVerbose || r
29800 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26  es==0).        &
29810 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73  & (zPrev==0 || s
29820 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
29830 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a  Parent, zPrev)).
29840 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29850 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29860 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20  out, "-- Parent 
29870 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61  table %s\n", zPa
29880 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rent);.         
29890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
298a0 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rev);.          
298b0 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f  zPrev = sqlite3_
298c0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50  mprintf("%s", zP
298d0 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
298e0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  }..        if( r
298f0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
29900 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
29910 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c  t, "%s%s --> %s\
29920 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49  n", zIndent, zCI
29930 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , zTarget);.    
29940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56      }else if( bV
29950 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
29960 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
29970 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74  ut, "%s/* no ext
29980 72 61 20 69 6e 64 65 78 65 73 20 72 65 71 75 69  ra indexes requi
29990 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73  red for %s -> %s
299a0 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   */\n",.        
299b0 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a        zIndent, z
299c0 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20  From, zTarget.  
299d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
299e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
299f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
29a00 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20  ree(zPrev);..   
29a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
29a30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29a40 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
29a50 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
29a60 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  }..    rc2 = sql
29a70 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
29a80 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ql);.    if( rc=
29a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29aa0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
29ab0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
29ac0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29ad0 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
29ae0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
29af0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  db));.    }.  }e
29b00 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
29b10 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
29b20 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
29b30 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20  sg(db));.  }..  
29b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29b50 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
29b60 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f  on of ".lint" do
29b70 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
29b80 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74  atic int lintDot
29b90 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
29ba0 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
29bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
29bc0 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
29bd0 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
29be0 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29c00 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
29c10 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
29c20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
29c30 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c50 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
29c60 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
29c70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20  ){.  int n;.  n 
29c80 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72  = (nArg>=2 ? str
29c90 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20  len30(azArg[1]) 
29ca0 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20  : 0);.  if( n<1 
29cb0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  || sqlite3_strni
29cc0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66  cmp(azArg[1], "f
29cd0 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29  key-indexes", n)
29ce0 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20   ) goto usage;. 
29cf0 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79   return lintFkey
29d00 49 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c 20  Indexes(pState, 
29d10 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20  azArg, nArg);.. 
29d20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69  usage:.  raw_pri
29d30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
29d40 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e  ge %s sub-comman
29d50 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c  d ?switches...?\
29d60 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
29d70 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29d80 72 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63  rr, "Where sub-c
29d90 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29  ommands are:\n")
29da0 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
29db0 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79  tderr, "    fkey
29dc0 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20  -indexes\n");.  
29dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29de0 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ROR;.}..#if !def
29df0 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
29e00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 73 74  _VIRTUALTABLE.st
29e10 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
29e20 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  repare(.  sqlite
29e30 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
29e40 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rc, .  const cha
29e50 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69  r *zSql, .  sqli
29e60 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
29e70 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t.){.  *ppStmt =
29e80 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
29e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29ea0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
29eb0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
29ec0 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
29ed0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
29ee0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29ef0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29f00 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72  (stderr, "sql er
29f10 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c  ror: %s (%d)\n",
29f20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
29f30 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
29f40 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
29f50 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  db).      );.   
29f60 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
29f70 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
29f80 20 43 72 65 61 74 65 20 61 20 70 72 65 70 61 72   Create a prepar
29f90 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 73 69  ed statement usi
29fa0 6e 67 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20  ng printf-style 
29fb0 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  arguments for th
29fc0 65 20 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e SQL..**.** Thi
29fd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75  s routine is cou
29fe0 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74  ld be marked "st
29ff0 61 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69  atic".  But it i
2a000 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65  s not always use
2a010 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20  d,.** depending 
2a020 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  on compile-time 
2a030 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69  options.  By omi
2a040 74 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69  tting the "stati
2a050 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20  c", we avoid.** 
2a060 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
2a070 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
2a080 20 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f   "defined but no
2a090 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64  t used"..*/.void
2a0a0 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2a0b0 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ntf(.  sqlite3 *
2a0c0 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
2a0d0 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
2a0e0 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e   **ppStmt,.  con
2a0f0 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a  st char *zFmt, .
2a100 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74    ....){.  *ppSt
2a110 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
2a120 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
2a130 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
2a140 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
2a150 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2a160 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  Fmt);.    z = sq
2a170 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2a180 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  Fmt, ap);.    va
2a190 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66  _end(ap);.    if
2a1a0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
2a1b0 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
2a1c0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2a1d0 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
2a1e0 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70  re(db, pRc, z, p
2a1f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71  pStmt);.      sq
2a200 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
2a210 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46     }.  }.}../* F
2a220 69 6e 61 6c 69 7a 65 20 74 68 65 20 70 72 65 70  inalize the prep
2a230 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
2a240 72 65 61 74 65 64 20 75 73 69 6e 67 20 73 68 65  reated using she
2a250 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
2a260 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
2a270 75 74 69 6e 65 20 69 73 20 63 6f 75 6c 64 20 62  utine is could b
2a280 65 20 6d 61 72 6b 65 64 20 22 73 74 61 74 69 63  e marked "static
2a290 22 2e 20 20 42 75 74 20 69 74 20 69 73 20 6e 6f  ".  But it is no
2a2a0 74 20 61 6c 77 61 79 73 20 75 73 65 64 2c 0a 2a  t always used,.*
2a2b0 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 63  * depending on c
2a2c0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
2a2d0 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74 74 69 6e  ons.  By omittin
2a2e0 67 20 74 68 65 20 22 73 74 61 74 69 63 22 2c 20  g the "static", 
2a2f0 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e 75 69 73  we avoid.** nuis
2a300 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ance compiler wa
2a310 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 22 64 65  rnings about "de
2a320 66 69 6e 65 64 20 62 75 74 20 6e 6f 74 20 75 73  fined but not us
2a330 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68 65  ed"..*/.void she
2a340 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e  llFinalize(.  in
2a350 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
2a360 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
2a370 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  {.  if( pStmt ){
2a380 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
2a390 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
2a3a0 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
2a3b0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2a3c0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2a3d0 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d  );.    if( *pRc=
2a3e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a3f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a410 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a420 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
2a430 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2a440 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
2a450 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d    }.      *pRc =
2a460 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
2a470 0a 0a 2f 2a 20 52 65 73 65 74 20 74 68 65 20 70  ../* Reset the p
2a480 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2a490 74 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  t created using 
2a4a0 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
2a4b0 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tf()..**.** This
2a4c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75 6c   routine is coul
2a4d0 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74 61  d be marked "sta
2a4e0 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69 73  tic".  But it is
2a4f0 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65 64   not always used
2a500 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  ,.** depending o
2a510 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  n compile-time o
2a520 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74  ptions.  By omit
2a530 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69 63  ting the "static
2a540 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e  ", we avoid.** n
2a550 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72  uisance compiler
2a560 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
2a570 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f 74  "defined but not
2a580 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20   used"..*/.void 
2a590 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e  shellReset(.  in
2a5a0 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
2a5b0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
2a5c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
2a5d0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
2a5e0 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  );.  if( *pRc==S
2a5f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a610 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2a620 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
2a630 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
2a640 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2a650 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
2a660 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73   error: %s\n", s
2a670 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
2a680 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ));.    }.    *p
2a690 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 23  Rc = rc;.  }.}.#
2a6a0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2a6b0 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d SQLITE_OMIT_VI
2a6c0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
2a6d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2a6e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2a6f0 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
2a700 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
2a710 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  B)./************
2a720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a760 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68  **.** The ".arch
2a770 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f  ive" or ".ar" co
2a780 6d 6d 61 6e 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  mmand..*/./*.** 
2a790 53 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73  Structure repres
2a7a0 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  enting a single 
2a7b0 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ".ar" command..*
2a7c0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2a7d0 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d   ArCommand ArCom
2a7e0 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43  mand;.struct ArC
2a7f0 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43  ommand {.  u8 eC
2a800 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  md;             
2a810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2a820 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20   AR_CMD_* value 
2a830 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65  */.  u8 bVerbose
2a840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a850 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a860 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75  --verbose */.  u
2a870 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20  8 bZip;         
2a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a890 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 61 72  * True if the ar
2a8a0 63 68 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a  chive is a ZIP *
2a8b0 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20  /.  u8 bDryRun; 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
2a8e0 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38  -dry-run */.  u8
2a8f0 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20   bAppend;       
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a910 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e   True if --appen
2a920 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43 6d  d */.  u8 fromCm
2a930 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  dLine;          
2a940 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 66 72         /* Run fr
2a950 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20 6f 66  om -A instead of
2a960 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69   .archive */.  i
2a970 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d  * Number of comm
2a9a0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2a9b0 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62  .  char *zSrcTab
2a9c0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2a9d0 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22     /* "sqlar", "
2a9e0 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20  zipfile($file)" 
2a9f0 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f  or "zip" */.  co
2aa00 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa20 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74   --file argument
2aa30 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
2aa40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa60 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72  * --directory ar
2aa70 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20  gument, or NULL 
2aa80 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
2aa90 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2aaa0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2aab0 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
2aac0 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ts */.  ShellSta
2aad0 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  te *p;          
2aae0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c          /* Shell
2aaf0 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69   state */.  sqli
2ab00 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2ab20 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2ab30 6e 67 20 74 68 65 20 61 72 63 68 69 76 65 20 2a  ng the archive *
2ab40 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  /.};../*.** Prin
2ab50 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  t a usage messag
2ab60 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f  e for the .ar co
2ab70 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20  mmand to stderr 
2ab80 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
2ab90 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74  E_ERROR..*/.stat
2aba0 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28 46  ic int arUsage(F
2abb0 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77 48  ILE *f){.  showH
2abc0 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65 22 29  elp(f,"archive")
2abd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2abe0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
2abf0 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
2ac00 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
2ac10 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
2ac20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
2ac30 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
2ac40 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
2ac50 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72 43  t arErrorMsg(ArC
2ac60 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
2ac70 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
2ac80 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2ac90 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
2aca0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
2acb0 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  t);.  z = sqlite
2acc0 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
2acd0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
2ace0 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  p);.  utf8_print
2acf0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2ad00 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69  : %s\n", z);.  i
2ad10 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c  f( pAr->fromCmdL
2ad20 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ine ){.    utf8_
2ad30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ad40 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20 6d  Use \"-A\" for m
2ad50 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20  ore help\n");.  
2ad60 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f  }else{.    utf8_
2ad70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ad80 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20 2d  Use \".archive -
2ad90 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65  -help\" for more
2ada0 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20   help\n");.  }. 
2adb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2adc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2add0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
2ade0 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43  * Values for ArC
2adf0 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a  ommand.eCmd..*/.
2ae00 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43  #define AR_CMD_C
2ae10 52 45 41 54 45 20 20 20 20 20 20 20 31 0a 23 64  REATE       1.#d
2ae20 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44  efine AR_CMD_UPD
2ae30 41 54 45 20 20 20 20 20 20 20 32 0a 23 64 65 66  ATE       2.#def
2ae40 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52  ine AR_CMD_INSER
2ae50 54 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e  T       3.#defin
2ae60 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2ae70 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
2ae80 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20  AR_CMD_LIST     
2ae90 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 41 52      5.#define AR
2aea0 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20  _CMD_HELP       
2aeb0 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72    6../*.** Other
2aec0 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73   (non-command) s
2aed0 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66  witches..*/.#def
2aee0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ine AR_SWITCH_VE
2aef0 52 42 4f 53 45 20 20 20 20 20 37 0a 23 64 65 66  RBOSE     7.#def
2af00 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ine AR_SWITCH_FI
2af10 4c 45 20 20 20 20 20 20 20 20 38 0a 23 64 65 66  LE        8.#def
2af20 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ine AR_SWITCH_DI
2af30 52 45 43 54 4f 52 59 20 20 20 39 0a 23 64 65 66  RECTORY   9.#def
2af40 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50  ine AR_SWITCH_AP
2af50 50 45 4e 44 20 20 20 20 20 31 30 0a 23 64 65 66  PEND     10.#def
2af60 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52  ine AR_SWITCH_DR
2af70 59 52 55 4e 20 20 20 20 20 31 31 0a 0a 73 74 61  YRUN     11..sta
2af80 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73  tic int arProces
2af90 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e  sSwitch(ArComman
2afa0 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69  d *pAr, int eSwi
2afb0 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tch, const char 
2afc0 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *zArg){.  switch
2afd0 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20  ( eSwitch ){.   
2afe0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
2aff0 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ATE:.    case AR
2b000 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
2b010 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
2b020 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ST:.    case AR_
2b030 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20  CMD_UPDATE:.    
2b040 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45  case AR_CMD_INSE
2b050 52 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  RT:.    case AR_
2b060 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20  CMD_HELP:.      
2b070 69 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b  if( pAr->eCmd ){
2b080 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b090 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2b0a0 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e  "multiple comman
2b0b0 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20  d options");.   
2b0c0 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e     }.      pAr->
2b0d0 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a  eCmd = eSwitch;.
2b0e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2b0f0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
2b100 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20 70  _DRYRUN:.      p
2b110 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b  Ar->bDryRun = 1;
2b120 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b130 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
2b140 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20  _VERBOSE:.      
2b150 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20  pAr->bVerbose = 
2b160 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2b170 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
2b180 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20 20  CH_APPEND:.     
2b190 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20   pAr->bAppend = 
2b1a0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  1;.      /* Fall
2b1b0 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c   thru into --fil
2b1c0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41 52  e */.    case AR
2b1d0 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20  _SWITCH_FILE:.  
2b1e0 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d      pAr->zFile =
2b1f0 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65   zArg;.      bre
2b200 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
2b210 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
2b220 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69  :.      pAr->zDi
2b230 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  r = zArg;.      
2b240 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
2b250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b260 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74  }../*.** Parse t
2b270 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
2b280 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d  for an ".ar" com
2b290 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74  mand. The result
2b2a0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
2b2b0 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  to.** structure 
2b2c0 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f  (*pAr). SQLITE_O
2b2d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2b2e0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
2b2f0 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73  e is parsed.** s
2b300 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68  uccessfully, oth
2b310 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
2b320 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
2b330 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  en to stderr and
2b340 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
2b350 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  R returned..*/.s
2b360 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72 73  tatic int arPars
2b370 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72  eCommand(.  char
2b380 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
2b390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2b3a0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2b3b0 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
2b3c0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2b3d0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b3f0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2b400 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
2b410 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
2b440 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
2b450 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
2b460 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  h {.    const ch
2b470 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63  ar *zLong;.    c
2b480 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20  har cShort;.    
2b490 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20  u8 eSwitch;.    
2b4a0 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53 77  u8 bArg;.  } aSw
2b4b0 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  itch[] = {.    {
2b4c0 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27 63   "create",    'c
2b4d0 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  ', AR_CMD_CREATE
2b4e0 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
2b4f0 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20 20   { "extract",   
2b500 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52  'x', AR_CMD_EXTR
2b510 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20  ACT,      0 },. 
2b520 20 20 20 7b 20 22 69 6e 73 65 72 74 22 2c 20 20     { "insert",  
2b530 20 20 27 69 27 2c 20 41 52 5f 43 4d 44 5f 49 4e    'i', AR_CMD_IN
2b540 53 45 52 54 2c 20 20 20 20 20 20 20 30 20 7d 2c  SERT,       0 },
2b550 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20  .    { "list",  
2b560 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f      't', AR_CMD_
2b570 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30 20  LIST,         0 
2b580 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65  },.    { "update
2b590 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d  ",    'u', AR_CM
2b5a0 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20 20  D_UPDATE,       
2b5b0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70  0 },.    { "help
2b5c0 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f  ",      'h', AR_
2b5d0 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20  CMD_HELP,       
2b5e0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65    0 },.    { "ve
2b5f0 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41  rbose",   'v', A
2b600 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45  R_SWITCH_VERBOSE
2b610 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22  ,   0 },.    { "
2b620 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c  file",      'f',
2b630 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c   AR_SWITCH_FILE,
2b640 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b        1 },.    {
2b650 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61   "append",    'a
2b660 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  ', AR_SWITCH_APP
2b670 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20  END,    1 },.   
2b680 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20   { "directory", 
2b690 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44  'C', AR_SWITCH_D
2b6a0 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20  IRECTORY, 1 },. 
2b6b0 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20     { "dryrun",  
2b6c0 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48    'n', AR_SWITCH
2b6d0 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c  _DRYRUN,    0 },
2b6e0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69  .  };.  int nSwi
2b6f0 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77  tch = sizeof(aSw
2b700 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73  itch) / sizeof(s
2b710 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b  truct ArSwitch);
2b720 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
2b730 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69  ch *pEnd = &aSwi
2b740 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20  tch[nSwitch];.. 
2b750 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a   if( nArg<=1 ){.
2b760 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b770 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67 20 6e  stderr, "Wrong n
2b780 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2b790 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b  ts.  Usage:\n");
2b7a0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55 73  .    return arUs
2b7b0 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d  age(stderr);.  }
2b7c0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2b7d0 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  z = azArg[1];.  
2b7e0 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
2b7f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 64  ){.      /* Trad
2b800 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74  itional style [t
2b810 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  ar] invocation *
2b820 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
2b830 20 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d 20       int iArg = 
2b840 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  2;.      for(i=0
2b850 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
2b860 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b870 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20   *zArg = 0;.    
2b880 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
2b890 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
2b8a0 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
2b8b0 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
2b8c0 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
2b8d0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
2b8e0 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20  =pOpt->cShort ) 
2b8f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2b900 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2b910 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
2b920 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
2b930 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72  rorMsg(pAr, "unr
2b940 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
2b950 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20  : %c", z[i]);.  
2b960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b970 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29  if( pOpt->bArg )
2b980 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b990 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20 20  iArg>=nArg ){.  
2b9a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2b9b0 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2b9c0 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
2b9d0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
2b9e0 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  c",z[i]);.      
2b9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ba00 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 41 72  zArg = azArg[iAr
2ba10 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g++];.        }.
2ba20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72          if( arPr
2ba30 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c  ocessSwitch(pAr,
2ba40 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20   pOpt->eSwitch, 
2ba50 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53  zArg) ) return S
2ba60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2ba70 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e     }.      pAr->
2ba80 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
2ba90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
2baa0 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  >nArg>0 ){.     
2bab0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
2bac0 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
2bad0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2bae0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72  .      /* Non-tr
2baf0 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63 61  aditional invoca
2bb00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
2bb10 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20 66 6f  t iArg;.      fo
2bb20 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67 3c 6e  r(iArg=1; iArg<n
2bb30 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20  Arg; iArg++){.  
2bb40 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2bb50 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b 69       z = azArg[i
2bb60 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  Arg];.        if
2bb70 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
2bb80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2bb90 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e  remaining comman
2bba0 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61 72 65  d line words are
2bbb0 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
2bbc0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
2bbd0 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
2bbe0 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
2bbf0 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
2bc00 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20  = nArg-iArg;.   
2bc10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2bc20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc30 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
2bc40 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ..        if( z[
2bc50 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]!='-' ){.     
2bc60 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2bc70 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20        /* One or 
2bc80 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74 69 6f  more short optio
2bc90 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
2bca0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b  for(i=1; i<n; i+
2bcb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2bcc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2bcd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bce0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
2bcf0 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20  h *pOpt;.       
2bd00 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
2bd10 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
2bd20 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2bd40 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
2bd50 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
2bd60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bd70 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d         if( pOpt=
2bd80 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
2bd90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2bda0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
2bdb0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
2bdc0 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a  on: %c", z[i]);.
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2bde0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2bdf0 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
2be00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
2be10 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  (n-1) ){.       
2be20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
2be30 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  &z[i+1];.       
2be40 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a           i = n;.
2be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2be60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2be70 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
2be80 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2bea0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2beb0 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  Ar, "option requ
2bec0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
2bed0 3a 20 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  : %c",.         
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 20 20 20 20 7a 5b 69 5d 29             z[i])
2bf00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bf10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bf20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2bf30 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
2bf40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf60 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
2bf70 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
2bf80 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
2bf90 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2bfa0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2bfb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2bfc0 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30  se if( z[2]=='\0
2bfd0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
2bfe0 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69  * A -- option, i
2bff0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
2c000 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
2c010 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a  mand line words.
2c020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
2c030 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
2c040 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
2c050 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
2c060 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20  azArg[iArg+1];. 
2c070 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
2c080 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31  rg = nArg-iArg-1
2c090 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c0a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2c0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
2c0c0 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a   long option */.
2c0d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2c0e0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20  char *zArg = 0; 
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2c100 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69  rgument for opti
2c110 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  on, if any */.  
2c120 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2c130 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20  rSwitch *pMatch 
2c140 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74  = 0;      /* Mat
2c150 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a  ching option */.
2c160 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2c170 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
2c180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c190 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  terator */.     
2c1a0 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
2c1b0 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
2c1c0 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
2c1d0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
2c1e0 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70   char *zLong = p
2c1f0 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20  Opt->zLong;.    
2c200 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32          if( (n-2
2c210 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e  )<=strlen30(zLon
2c220 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  g) && 0==memcmp(
2c230 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d  &z[2], zLong, n-
2c240 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
2c250 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2c260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c270 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
2c280 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75  Msg(pAr, "ambigu
2c290 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c  ous option: %s",
2c2a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
2c2b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c2c0 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
2c2d0 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20  = pOpt;.        
2c2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c300 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
2c310 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20   pMatch==0 ){.  
2c320 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c330 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2c340 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
2c350 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a  ption: %s", z);.
2c360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c370 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2c380 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
2c390 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
2c3a0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
2c3b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c3c0 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2c3d0 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
2c3e0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
2c3f0 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
2c400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c410 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b    zArg = azArg[+
2c420 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  +iArg];.        
2c430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2c440 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
2c450 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65  h(pAr, pMatch->e
2c460 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
2c470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c480 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
2c490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c4a0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2c4b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2c4c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
2c4d0 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72  umes that all ar
2c4e0 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  guments within t
2c4f0 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41  he ArCommand.azA
2c500 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65  rg[].** array re
2c510 66 65 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d  fer to archive m
2c520 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74  embers, as for t
2c530 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20  he --extract or 
2c540 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e  --list commands.
2c550 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74   .** It checks t
2c560 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d  hat each of them
2c570 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66   are present. If
2c580 20 61 6e 79 20 73 70 65 63 69 66 69 65 64 20 66   any specified f
2c590 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72  ile is not.** pr
2c5a0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63  esent in the arc
2c5b0 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69  hive, an error i
2c5c0 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64  s printed to std
2c5d0 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  err and an error
2c5e0 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65  .** code returne
2c5f0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
2c600 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61   all specified a
2c610 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65  rguments are pre
2c620 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61  sent in.** the a
2c630 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f  rchive, SQLITE_O
2c640 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2c650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c660 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74 72  on strips any tr
2c670 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61  ailing '/' chara
2c680 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20  cters from each 
2c690 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69  argument..** Thi
2c6a0 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20  s is consistent 
2c6b0 77 69 74 68 20 74 68 65 20 77 61 79 20 74 68 65  with the way the
2c6c0 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73   [tar] command s
2c6d0 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a  eems to work on.
2c6e0 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61  ** Linux..*/.sta
2c6f0 74 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45  tic int arCheckE
2c700 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64  ntries(ArCommand
2c710 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63   *pAr){.  int rc
2c720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c730 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b  if( pAr->nArg ){
2c740 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
2c750 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2c760 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  *pTest = 0;..   
2c770 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2c780 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2c790 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20  , &pTest,.      
2c7a0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
2c7b0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d  ROM %s WHERE nam
2c7c0 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20  e=$name", .     
2c7d0 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c     pAr->zSrcTabl
2c7e0 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d  e.    );.    j =
2c7f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
2c800 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54  rameter_index(pT
2c810 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20  est, "$name");. 
2c820 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2c830 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53  r->nArg && rc==S
2c840 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
2c850 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
2c860 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20  pAr->azArg[i];. 
2c870 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
2c880 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20  len30(z);.      
2c890 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20  int bOk = 0;.   
2c8a0 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26     while( n>0 &&
2c8b0 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e   z[n-1]=='/' ) n
2c8c0 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  --;.      z[n] =
2c8d0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c   '\0';.      sql
2c8e0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
2c8f0 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20  Test, j, z, -1, 
2c900 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
2c910 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
2c920 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2c930 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20  ep(pTest) ){.   
2c940 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
2c950 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c      }.      shel
2c960 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65 73  lReset(&rc, pTes
2c970 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2c980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2c990 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
2c9a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c9b0 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20  err, "not found 
2c9c0 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e  in archive: %s\n
2c9d0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
2c9e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2c9f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ca00 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
2ca10 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  e(&rc, pTest);. 
2ca20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ca30 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  }../*.** Format 
2ca40 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2ca50 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
2ca60 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c  against the "sql
2ca70 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  ar" table to.** 
2ca80 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63  identify all arc
2ca90 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61  hive members tha
2caa0 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d  t match the comm
2cab0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65  and arguments he
2cac0 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e  ld.** in (*pAr).
2cad0 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45 52   Leave this WHER
2cae0 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a  E clause in (*pz
2caf0 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72 65  Where) before re
2cb00 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  turning..** The 
2cb10 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
2cb20 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75  sible for eventu
2cb30 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  ally calling sql
2cb40 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a  ite3_free() on.*
2cb50 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28  * any non-NULL (
2cb60 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e  *pzWhere) value.
2cb70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2cb80 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20  arWhereClause(. 
2cb90 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72   int *pRc, .  Ar
2cba0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20  Command *pAr, . 
2cbb0 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20   char **pzWhere 
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbd0 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45   /* OUT: New WHE
2cbe0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a  RE clause */.){.
2cbf0 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
2cc00 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
2cc10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cc20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d   if( pAr->nArg==
2cc30 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72  0 ){.      zWher
2cc40 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2cc50 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65  ntf("1");.    }e
2cc60 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2cc70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
2cc80 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20  ar *zSep = "";. 
2cc90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2cca0 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b  pAr->nArg; i++){
2ccb0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2ccc0 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a  har *z = pAr->az
2ccd0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
2cce0 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  zWhere = sqlite3
2ccf0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2cd00 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d      "%z%s name =
2cd10 20 27 25 71 27 20 4f 52 20 73 75 62 73 74 72 28   '%q' OR substr(
2cd20 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71  name,1,%d) = '%q
2cd30 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  /'", .          
2cd40 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c  zWhere, zSep, z,
2cd50 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20   strlen30(z)+1, 
2cd60 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  z.        );.   
2cd70 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d       if( zWhere=
2cd80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2cd90 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
2cda0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
2cdb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2cdc0 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
2cdd0 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   OR ";.      }. 
2cde0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68     }.  }.  *pzWh
2cdf0 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a  ere = zWhere;.}.
2ce00 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2ce10 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69  ation of .ar "li
2ce20 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  sT" command. .*/
2ce30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69  .static int arLi
2ce40 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d  stCommand(ArComm
2ce50 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e  and *pAr){.  con
2ce60 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
2ce70 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20  "SELECT %s FROM 
2ce80 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20  %s WHERE %s"; . 
2ce90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43   const char *azC
2cea0 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e  ols[] = {.    "n
2ceb0 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64  ame",.    "lsmod
2cec0 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74  e(mode), sz, dat
2ced0 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e  etime(mtime, 'un
2cee0 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22  ixepoch'), name"
2cef0 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a  .  };..  char *z
2cf00 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c  Where = 0;.  sql
2cf10 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20  ite3_stmt *pSql 
2cf20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
2cf30 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
2cf40 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72  tries(pAr);.  ar
2cf50 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
2cf60 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
2cf70 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  .  shellPrepareP
2cf80 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
2cf90 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c  rc, &pSql, zSql,
2cfa0 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65   azCols[pAr->bVe
2cfb0 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20  rbose],.        
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72               pAr
2cfd0 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68  ->zSrcTable, zWh
2cfe0 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d  ere);.  if( pAr-
2cff0 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
2d000 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2d010 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
2d020 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
2d030 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l));.  }else{.  
2d040 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2d050 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2d060 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2d070 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20  ep(pSql) ){.    
2d080 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62    if( pAr->bVerb
2d090 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ose ){.        u
2d0a0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2d0b0 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30  p->out, "%s % 10
2d0c0 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20  d  %s  %s\n",.  
2d0d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d0e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2d0f0 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ql, 0),.        
2d100 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
2d110 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c  mn_int(pSql, 1),
2d120 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
2d130 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2d140 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20  t(pSql, 2),.    
2d150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2d160 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2d170 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  , 3).        );.
2d180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d190 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d1a0 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2d1b0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
2d1c0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2d1d0 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0));.      }.   
2d1e0 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69   }.  }.  shellFi
2d1f0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c  nalize(&rc, pSql
2d200 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2d210 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(zWhere);.  ret
2d220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2d230 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2d240 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63 74   of .ar "eXtract
2d250 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73  " command. .*/.s
2d260 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 74 72  tatic int arExtr
2d270 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  actCommand(ArCom
2d280 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
2d290 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20  nst char *zSql1 
2d2a0 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22  = .    "SELECT "
2d2b0 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20  .    " ($dir || 
2d2c0 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72  name),".    " wr
2d2d0 69 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c  itefile(($dir ||
2d2e0 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65   name), %s, mode
2d2f0 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22  , mtime) ".    "
2d300 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25  FROM %s WHERE (%
2d310 73 29 20 41 4e 44 20 28 64 61 74 61 20 49 53 20  s) AND (data IS 
2d320 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79  NULL OR $dirOnly
2d330 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44   = 0)".    " AND
2d340 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27   name NOT GLOB '
2d350 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20  *..[/\\]*'";..  
2d360 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78  const char *azEx
2d370 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20  traArg[] = { .  
2d380 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72    "sqlar_uncompr
2d390 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a  ess(data, sz)",.
2d3a0 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a      "data".  };.
2d3b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2d3c0 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pSql = 0;.  int
2d3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d3e0 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  .  char *zDir = 
2d3f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  0;.  char *zWher
2d400 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
2d410 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  j;..  /* If argu
2d420 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66  ments are specif
2d430 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ied, check that 
2d440 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78  they actually ex
2d450 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ist within.  ** 
2d460 74 68 65 20 61 72 63 68 69 76 65 20 62 65 66 6f  the archive befo
2d470 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41  re proceeding. A
2d480 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57  nd formulate a W
2d490 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20  HERE clause to. 
2d4a0 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20   ** match them. 
2d4b0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65   */.  rc = arChe
2d4c0 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a  ckEntries(pAr);.
2d4d0 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28    arWhereClause(
2d4e0 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72  &rc, pAr, &zWher
2d4f0 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  e);..  if( rc==S
2d500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d510 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b  if( pAr->zDir ){
2d520 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
2d530 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2d540 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b  s/", pAr->zDir);
2d550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d560 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33    zDir = sqlite3
2d570 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20  _mprintf("");.  
2d580 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72    }.    if( zDir
2d590 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
2d5a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2d5b0 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
2d5c0 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
2d5d0 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a   &pSql, zSql1, .
2d5e0 20 20 20 20 20 20 61 7a 45 78 74 72 61 41 72 67        azExtraArg
2d5f0 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72  [pAr->bZip], pAr
2d600 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68  ->zSrcTable, zWh
2d610 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  ere.  );..  if( 
2d620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d630 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  .    j = sqlite3
2d640 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2d650 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69  index(pSql, "$di
2d660 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r");.    sqlite3
2d670 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c  _bind_text(pSql,
2d680 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51   j, zDir, -1, SQ
2d690 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20  LITE_STATIC);.. 
2d6a0 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45     /* Run the SE
2d6b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
2d6c0 77 69 63 65 2e 20 54 68 65 20 66 69 72 73 74 20  wice. The first 
2d6d0 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28  time, writefile(
2d6e0 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  ) is called.    
2d6f0 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69  ** for all archi
2d700 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ve members that 
2d710 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63  should be extrac
2d720 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ted. The second 
2d730 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c  time,.    ** onl
2d740 79 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74  y for the direct
2d750 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73 20 62  ories. This is b
2d760 65 63 61 75 73 65 20 74 68 65 20 74 69 6d 65 73  ecause the times
2d770 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a  tamps for.    **
2d780 20 65 78 74 72 61 63 74 65 64 20 64 69 72 65 63   extracted direc
2d790 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20 72  tories must be r
2d7a0 65 73 65 74 20 61 66 74 65 72 20 74 68 65 79 20  eset after they 
2d7b0 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61  are populated (a
2d7c0 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  s.    ** populat
2d7d0 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73  ing them changes
2d7e0 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e   the timestamp).
2d7f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
2d800 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
2d810 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
2d820 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2d830 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f  dex(pSql, "$dirO
2d840 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  nly");.      sql
2d850 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
2d860 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20  ql, j, i);.     
2d870 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
2d880 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  n ){.        utf
2d890 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2d8a0 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
2d8b0 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29  lite3_sql(pSql))
2d8c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2d8d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63         while( rc
2d8e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2d8f0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2d900 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
2d910 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2d920 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72  ==0 && pAr->bVer
2d930 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
2d940 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d950 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2d960 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
2d970 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
2d980 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
2d990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d9a0 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73  }.      shellRes
2d9b0 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  et(&rc, pSql);. 
2d9c0 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
2d9d0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c  nalize(&rc, pSql
2d9e0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2d9f0 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20  3_free(zDir);.  
2da00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
2da10 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ere);.  return r
2da20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  c;.}../*.** Run 
2da30 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2da40 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69  t in zSql.  Or i
2da50 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72  f doing a --dryr
2da60 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74  un, merely print
2da70 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74   it out..*/.stat
2da80 69 63 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c  ic int arExecSql
2da90 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c  (ArCommand *pAr,
2daa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2dab0 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  l){.  int rc;.  
2dac0 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e  if( pAr->bDryRun
2dad0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
2dae0 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
2daf0 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
2db00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2db10 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2db20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2db30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2db40 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20  3_exec(pAr->db, 
2db50 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
2db60 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  r);.    if( zErr
2db70 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2db80 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45  rintf(stdout, "E
2db90 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  RROR: %s\n", zEr
2dba0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2dbb0 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2dbc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2dbd0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
2dbe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2dbf0 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c 20 22   .ar "create", "
2dc00 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22 75 70  insert", and "up
2dc10 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a  date" commands..
2dc20 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61 74 65  **.**     create
2dc30 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65 61 74      ->     Creat
2dc40 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72 63 68  e a new SQL arch
2dc50 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72  ive.**     inser
2dc60 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65  t    ->     Inse
2dc70 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74 20 61  rt or reinsert a
2dc80 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65 64 0a  ll files listed.
2dc90 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20 20 20  **     update   
2dca0 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20 66   ->     Insert f
2dcb0 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 63  iles that have c
2dcc0 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74 20 77  hanged or that w
2dcd0 65 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  ere not.**      
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcf0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20 74 68  previously in th
2dd00 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20  e archive.**.** 
2dd10 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
2dd20 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
2dd30 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
2dd40 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2dd50 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
2dd60 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
2dd70 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
2dd80 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
2dd90 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
2dda0 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
2ddb0 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
2ddc0 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
2ddd0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
2dde0 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
2ddf0 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
2de00 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
2de10 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
2de20 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
2de30 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
2de40 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
2de50 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
2de60 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
2de70 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
2de80 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22  eginning.  The "
2de90 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a  insert" command.
2dea0 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72 77 72  ** always overwr
2deb0 69 74 65 73 20 65 76 65 72 79 20 66 69 6c 65 20  ites every file 
2dec0 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d  named on the com
2ded0 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65  mand-line, where
2dee0 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65 22 20   as.** "update" 
2def0 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
2df00 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72 20 6d  if the size or m
2df10 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61 73  time or mode has
2df20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61   changed..*/.sta
2df30 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
2df40 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2df50 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
2df60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2df70 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72     /* Command ar
2df80 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69  guments and opti
2df90 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70  ons */.  int bUp
2dfa0 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
2dfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65           /* true
2dfc0 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e   for a --create.
2dfd0 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49   */.  int bOnlyI
2dfe0 66 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20  fChanged        
2dff0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70        /* Only up
2e000 64 61 74 65 20 69 66 20 66 69 6c 65 20 68 61 73  date if file has
2e010 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20   changed */.){. 
2e020 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72   const char *zCr
2e030 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43  eate = .      "C
2e040 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
2e050 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61 72 28  OT EXISTS sqlar(
2e060 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d  \n".      "  nam
2e070 65 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  e TEXT PRIMARY K
2e080 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20  EY,  -- name of 
2e090 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20  the file\n".    
2e0a0 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20    "  mode INT,  
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
2e0c0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
2e0d0 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d  ns\n".      "  m
2e0e0 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20  time INT,       
2e0f0 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d         -- last m
2e100 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65  odification time
2e110 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20  \n".      "  sz 
2e120 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  INT,            
2e130 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c       -- original
2e140 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20   file size\n".  
2e150 20 20 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42      "  data BLOB
2e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2e170 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e  - compressed con
2e180 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29  tent\n".      ")
2e190 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
2e1a0 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54  *zDrop = "DROP T
2e1b0 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 73  ABLE IF EXISTS s
2e1c0 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63  qlar";.  const c
2e1d0 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b  har *zInsertFmt[
2e1e0 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50  2] = {.     "REP
2e1f0 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d  LACE INTO %s(nam
2e200 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c  e,mode,mtime,sz,
2e210 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
2e220 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20   SELECT\n".     
2e230 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20  "    %s,\n".    
2e240 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20   "    mode,\n". 
2e250 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c      "    mtime,\
2e260 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43 41 53  n".     "    CAS
2e270 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28  E substr(lsmode(
2e280 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20  mode),1,1)\n".  
2e290 20 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27     "      WHEN '
2e2a0 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64  -' THEN length(d
2e2b0 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
2e2c0 20 20 20 20 57 48 45 4e 20 27 64 27 20 54 48 45      WHEN 'd' THE
2e2d0 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  N 0\n".     "   
2e2e0 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c     ELSE -1 END,\
2e2f0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c  n".     "    sql
2e300 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61  ar_compress(data
2e310 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f  )\n".     "  FRO
2e320 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 20 41  M fsdir(%Q,%Q) A
2e330 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22  S disk\n".     "
2e340 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d    WHERE lsmode(m
2e350 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f  ode) NOT LIKE '?
2e360 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20  %%'%s;".     ,. 
2e370 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
2e380 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d  O %s(name,mode,m
2e390 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20  time,data)\n".  
2e3a0 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a     "  SELECT\n".
2e3b0 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22       "    %s,\n"
2e3c0 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c  .     "    mode,
2e3d0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74  \n".     "    mt
2e3e0 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ime,\n".     "  
2e3f0 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22    data\n".     "
2e400 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c    FROM fsdir(%Q,
2e410 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20  %Q) AS disk\n". 
2e420 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d      "  WHERE lsm
2e430 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49  ode(mode) NOT LI
2e440 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d  KE '?%%'%s;".  }
2e450 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61      /* For itera
2e480 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46  ting through azF
2e490 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ile[] */.  int r
2e4a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2e4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e4c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
2e4d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
2e4e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2e4f0 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f  * SQL table into
2e500 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74   which to insert
2e510 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   */.  char *zSql
2e520 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35  ;.  char zTemp[5
2e530 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 69  0];.  char *zExi
2e540 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78  sts = 0;..  arEx
2e550 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47  ecSql(pAr, "PRAG
2e560 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32  MA page_size=512
2e570 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65  ");.  rc = arExe
2e580 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50  cSql(pAr, "SAVEP
2e590 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66  OINT ar;");.  if
2e5a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e5b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a  ) return rc;.  z
2e5c0 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20  Temp[0] = 0; .  
2e5d0 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b  if( pAr->bZip ){
2e5e0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
2e5f0 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76  ze the zipfile v
2e600 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66  irtual table, if
2e610 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
2e620 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65    if( pAr->zFile
2e630 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e640 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20  3_uint64 r;.    
2e650 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2e660 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26  ness(sizeof(r),&
2e670 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2e680 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2e690 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22  f(zTemp),zTemp,"
2e6a0 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a  zip%016llx",r);.
2e6b0 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65        zTab = zTe
2e6c0 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  mp;.      zSql =
2e6d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2e6e0 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41  (.         "CREA
2e6f0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
2e700 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a   temp.%s USING z
2e710 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20  ipfile(%Q)",.   
2e720 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d        zTab, pAr-
2e730 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a  >zFile.      );.
2e740 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65        rc = arExe
2e750 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b  cSql(pAr, zSql);
2e760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e770 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2e780 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62  else{.      zTab
2e790 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a   = "zip";.    }.
2e7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e7b0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74  Initialize the t
2e7c0 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41  able for an SQLA
2e7d0 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20  R */.    zTab = 
2e7e0 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28  "sqlar";.    if(
2e7f0 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20   bUpdate==0 ){. 
2e800 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63       rc = arExec
2e810 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b  Sql(pAr, zDrop);
2e820 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e830 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2e840 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69  end_ar_transacti
2e850 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  on;.    }.    rc
2e860 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2e870 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a  , zCreate);.  }.
2e880 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43 68 61    if( bOnlyIfCha
2e890 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 69  nged ){.    zExi
2e8a0 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sts = sqlite3_mp
2e8b0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 20 41  rintf(.      " A
2e8c0 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 22 0a  ND NOT EXISTS(".
2e8d0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
2e8e0 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53 20 6d  T 1 FROM %s AS m
2e8f0 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  em".          " 
2e900 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64  WHERE mem.name=d
2e910 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20  isk.name".      
2e920 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74      " AND mem.mt
2e930 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a  ime=disk.mtime".
2e940 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
2e950 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f  mem.mode=disk.mo
2e960 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d  de)", zTab);.  }
2e970 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69 73 74  else{.    zExist
2e980 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
2e990 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69  ntf("");.  }.  i
2e9a0 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20 29 20  f( zExists==0 ) 
2e9b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e9c0 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  M;.  for(i=0; i<
2e9d0 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
2e9e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
2e9f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
2ea00 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  2 = sqlite3_mpri
2ea10 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70  ntf(zInsertFmt[p
2ea20 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c  Ar->bZip], zTab,
2ea30 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62 56  .        pAr->bV
2ea40 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f  erbose ? "shell_
2ea50 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20  putsnl(name)" : 
2ea60 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20  "name",.        
2ea70 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70  pAr->azArg[i], p
2ea80 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74  Ar->zDir, zExist
2ea90 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45  s);.    rc = arE
2eaa0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2eab0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
2eac0 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d  free(zSql2);.  }
2ead0 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74  .end_ar_transact
2eae0 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ion:.  if( rc!=S
2eaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb00 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72  sqlite3_exec(pAr
2eb10 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20  ->db, "ROLLBACK 
2eb20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61  TO ar; RELEASE a
2eb30 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  r;", 0, 0, 0);. 
2eb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2eb50 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2eb60 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a  "RELEASE ar;");.
2eb70 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69      if( pAr->bZi
2eb80 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20  p && pAr->zFile 
2eb90 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
2eba0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2ebb0 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c  "DROP TABLE %s",
2ebc0 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61   zTemp);.      a
2ebd0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2ebe0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
2ebf0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2ec00 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2ec10 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74 73 29  e3_free(zExists)
2ec20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2ec30 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2ec40 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20  tation of ".ar" 
2ec50 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
2ec60 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74  static int arDot
2ec70 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
2ec80 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
2ec90 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2eca0 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
2ecb0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f  ate */.  int fro
2ecc0 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20 20  mCmdLine,       
2ecd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ece0 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   -A command-line
2ecf0 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72   option, not .ar
2ed00 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a   cmd */.  char *
2ed10 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
2ed20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2ed30 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
2ed40 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
2ed50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed80 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
2ed90 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43  rg[] */.){.  ArC
2eda0 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e  ommand cmd;.  in
2edb0 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26  t rc;.  memset(&
2edc0 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  cmd, 0, sizeof(c
2edd0 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d  md));.  cmd.from
2ede0 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d  CmdLine = fromCm
2edf0 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72  dLine;.  rc = ar
2ee00 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41  ParseCommand(azA
2ee10 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b  rg, nArg, &cmd);
2ee20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ee30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2ee40 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f  eDbType = SHELL_
2ee50 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20  OPEN_UNSPEC;.   
2ee60 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b   cmd.p = pState;
2ee70 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53  .    cmd.db = pS
2ee80 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66  tate->db;.    if
2ee90 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20  ( cmd.zFile ){. 
2eea0 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 64       eDbType = d
2eeb0 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
2eec0 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b  e(cmd.zFile, 1);
2eed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2eee0 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74 61    eDbType = pSta
2eef0 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20  te->openMode;.  
2ef00 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54    }.    if( eDbT
2ef10 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
2ef20 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
2ef30 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
2ef40 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c  R_CMD_EXTRACT ||
2ef50 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2ef60 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20  D_LIST ){.      
2ef70 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d    if( cmd.zFile=
2ef80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ef90 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
2efa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2efb0 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20  "zip");.        
2efc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2efd0 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2efe0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2eff0 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20  ("zipfile(%Q)", 
2f000 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  cmd.zFile);.    
2f010 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2f020 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31      cmd.bZip = 1
2f030 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f040 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
2f050 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20     int flags;.  
2f060 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70      if( cmd.bApp
2f070 65 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d 20  end ) eDbType = 
2f080 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2f090 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20  DVFS;.      if( 
2f0a0 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2f0b0 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65  _CREATE || cmd.e
2f0c0 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45  Cmd==AR_CMD_INSE
2f0d0 52 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RT .           |
2f0e0 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  | cmd.eCmd==AR_C
2f0f0 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  MD_UPDATE ){.   
2f100 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
2f110 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2f120 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2f130 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
2f140 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
2f150 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
2f160 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2f170 7d 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d  }.      cmd.db =
2f180 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d   0;.      if( cm
2f190 64 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  d.bDryRun ){.   
2f1a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f1b0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d  (pState->out, "-
2f1c0 2d 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  - open database 
2f1d0 27 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a  '%s'%s\n", cmd.z
2f1e0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
2f1f0 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c     eDbType==SHEL
2f200 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2f210 20 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64   ? " using 'apnd
2f220 76 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20  vfs'" : "");.   
2f230 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2f240 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
2f250 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e  cmd.zFile, &cmd.
2f260 64 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20  db, flags, .    
2f270 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65           eDbType
2f280 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  ==SHELL_OPEN_APP
2f290 45 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66  ENDVFS ? "apndvf
2f2a0 73 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69  s" : 0);.      i
2f2b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2f2d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f2e0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
2f2f0 65 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a  e: %s (%s)\n", .
2f300 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
2f310 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65  zFile, sqlite3_e
2f320 72 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20  rrmsg(cmd.db).  
2f330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2f340 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d   goto end_ar_com
2f350 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mand;.      }.  
2f360 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
2f370 69 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20  io_init(cmd.db, 
2f380 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2f390 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
2f3a0 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  cmd.db, 0, 0);. 
2f3b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65       sqlite3_cre
2f3c0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64  ate_function(cmd
2f3d0 2e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73  .db, "shell_puts
2f3e0 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nl", 1, SQLITE_U
2f3f0 54 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20  TF8, cmd.p,.    
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f410 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50            shellP
2f420 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  utsFunc, 0, 0);.
2f430 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2f440 6d 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20  md.zSrcTable==0 
2f450 26 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26  && cmd.bZip==0 &
2f460 26 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43  & cmd.eCmd!=AR_C
2f470 4d 44 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20  MD_HELP ){.     
2f480 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41   if( cmd.eCmd!=A
2f490 52 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20  R_CMD_CREATE.   
2f4a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74      && sqlite3_t
2f4b0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
2f4c0 64 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73  data(cmd.db,0,"s
2f4d0 71 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30  qlar","name",0,0
2f4e0 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b  ,0,0,0).      ){
2f4f0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2f500 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61  intf(stderr, "da
2f510 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  tabase does not 
2f520 63 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61  contain an 'sqla
2f530 72 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20  r' table\n");.  
2f540 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f550 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2f560 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d   goto end_ar_com
2f570 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mand;.      }.  
2f580 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c      cmd.zSrcTabl
2f590 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2f5a0 6e 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20  ntf("sqlar");.  
2f5b0 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
2f5c0 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20   cmd.eCmd ){.   
2f5d0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43     case AR_CMD_C
2f5e0 52 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72  REATE:.        r
2f5f0 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70  c = arCreateOrUp
2f600 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  dateCommand(&cmd
2f610 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2f620 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
2f630 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
2f640 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  CT:.        rc =
2f650 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e   arExtractComman
2f660 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20  d(&cmd);.       
2f670 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
2f680 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a  ase AR_CMD_LIST:
2f690 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2f6a0 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  ListCommand(&cmd
2f6b0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2f6c0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2f6d0 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20  _CMD_HELP:.     
2f6e0 20 20 20 61 72 55 73 61 67 65 28 70 53 74 61 74     arUsage(pStat
2f6f0 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  e->out);.       
2f700 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
2f710 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52  ase AR_CMD_INSER
2f720 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  T:.        rc = 
2f730 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65  arCreateOrUpdate
2f740 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c  Command(&cmd, 1,
2f750 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
2f760 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
2f770 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
2f780 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
2f790 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
2f7a0 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
2f7b0 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
2f7c0 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b  and(&cmd, 1, 1);
2f7d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2f7e0 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72      }.  }.end_ar
2f7f0 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20  _command:.  if( 
2f800 63 6d 64 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e  cmd.db!=pState->
2f810 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f  db ){.    close_
2f820 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a  db(cmd.db);.  }.
2f830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
2f840 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a  md.zSrcTable);..
2f850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
2f860 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61  * End of the ".a
2f870 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
2f880 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a   command logic.*
2f890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2f8e0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2f8f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2f900 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2f910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2f920 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 23 69  AVE_ZLIB) */..#i
2f930 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2f940 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2f950 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
2f960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
2f970 50 41 47 45 5f 56 54 41 42 29 0a 2f 2a 0a 2a 2a  PAGE_VTAB)./*.**
2f980 20 49 66 20 28 2a 70 52 63 29 20 69 73 20 6e 6f   If (*pRc) is no
2f990 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
2f9a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f9b0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
2f9c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
2f9d0 72 77 69 73 65 2c 20 74 68 65 20 53 51 4c 20 73  rwise, the SQL s
2f9e0 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74  tatement or stat
2f9f0 65 6d 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20 61  ements in zSql a
2fa00 72 65 20 65 78 65 63 75 74 65 64 20 75 73 69 6e  re executed usin
2fa10 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  g.** database co
2fa20 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 6e 64 20  nnection db and 
2fa30 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77  the error code w
2fa40 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 63 20 62  ritten to *pRc b
2fa50 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66 75  efore.** this fu
2fa60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
2fa70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2fa80 68 65 6c 6c 45 78 65 63 28 73 71 6c 69 74 65 33  hellExec(sqlite3
2fa90 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20   *db, int *pRc, 
2faa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2fab0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70  ){.  int rc = *p
2fac0 52 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  Rc;.  if( rc==SQ
2fad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
2fae0 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2faf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2fb00 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30  exec(db, zSql, 0
2fb10 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20  , 0, &zErr);.   
2fb20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fb30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
2fb40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2fb50 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
2fb60 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  , zErr);.    }. 
2fb70 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
2fb80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  }.}../*.** Like 
2fb90 73 68 65 6c 6c 45 78 65 63 28 29 2c 20 65 78 63  shellExec(), exc
2fba0 65 70 74 20 74 68 61 74 20 7a 46 6d 74 20 69 73  ept that zFmt is
2fbb0 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c   a printf() styl
2fbc0 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  e format string.
2fbd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fbe0 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28  shellExecPrintf(
2fbf0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2fc00 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
2fc10 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
2fc20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
2fc30 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2fc40 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
2fc50 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74  st ap;.    va_st
2fc60 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
2fc70 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
2fc80 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
2fc90 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
2fca0 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
2fcb0 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
2fcc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2fcd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2fce0 68 65 6c 6c 45 78 65 63 28 64 62 2c 20 70 52 63  hellExec(db, pRc
2fcf0 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , z);.    }.    
2fd00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
2fd10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
2fd20 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2fd30 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2fd40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fd50 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2fd60 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
2fd70 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
2fd80 6d 61 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  made to allocate
2fd90 2c 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  , zero and retur
2fda0 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
2fdb0 6f 20 61 20 62 75 66 66 65 72 20 6e 42 79 74 65  o a buffer nByte
2fdc0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
2fdd0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
2fde0 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
2fdf0 73 65 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54 45  set.** to SQLITE
2fe00 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20  _NOMEM and NULL 
2fe10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2fe20 74 69 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c 4d  tic void *shellM
2fe30 61 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20  alloc(int *pRc, 
2fe40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
2fe50 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  yte){.  void *pR
2fe60 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  et = 0;.  if( *p
2fe70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
2fe80 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
2fe90 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
2fea0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
2feb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  t==0 ){.      *p
2fec0 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2fed0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2fee0 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
2fef0 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
2ff00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2ff10 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
2ff20 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2ff30 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2ff40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ff50 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2ff60 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
2ff70 2c 20 7a 46 6d 74 20 69 73 20 74 72 65 61 74 65  , zFmt is treate
2ff80 64 20 61 73 20 61 20 70 72 69 6e 74 66 28 29 20  d as a printf() 
2ff90 73 74 79 6c 65 20 73 74 72 69 6e 67 2e 20 54 68  style string. Th
2ffa0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 66  e result of.** f
2ffb0 6f 72 6d 61 74 74 69 6e 67 20 69 74 20 61 6c 6f  ormatting it alo
2ffc0 6e 67 20 77 69 74 68 20 61 6e 79 20 74 72 61 69  ng with any trai
2ffd0 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 69  ling arguments i
2ffe0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  s written into a
2fff0 20 0a 2a 2a 20 62 75 66 66 65 72 20 6f 62 74 61   .** buffer obta
30000 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
30010 33 5f 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64 20  3_malloc(), and 
30020 70 6f 69 6e 74 65 72 20 74 6f 20 77 68 69 63 68  pointer to which
30030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
30040 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
30050 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
30060 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
30070 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
30080 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20  buffer.** using 
30090 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
300a0 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a 2a  3_free()..** .**
300b0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
300c0 20 6f 63 63 75 72 73 2c 20 28 2a 70 52 63 29 20   occurs, (*pRc) 
300d0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
300e0 5f 4e 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55 4c  _NOMEM and a NUL
300f0 4c 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72 65  L .** pointer re
30100 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
30110 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50 72  c char *shellMPr
30120 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63  intf(int *pRc, c
30130 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
30140 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
30150 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
30160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30170 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
30180 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
30190 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
301a0 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
301b0 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  zFmt, ap);.    v
301c0 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
301d0 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
301e0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
301f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
30200 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 73 74    return z;.}.st
30210 61 74 69 63 20 69 6e 74 20 73 68 61 72 65 64 53  atic int sharedS
30220 63 68 65 6d 61 46 69 78 28 53 68 65 6c 6c 53 74  chemaFix(ShellSt
30230 61 74 65 20 2a 70 53 74 61 74 65 2c 20 63 6f 6e  ate *pState, con
30240 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e  st char *zDb, in
30250 74 20 65 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t eFix){.  int r
30260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30270 20 69 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 0a   i64 iLast = 0;.
30280 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20    int iCookie = 
30290 30 3b 0a 20 20 69 6e 74 20 69 41 75 74 6f 56 61  0;.  int iAutoVa
302a0 63 75 75 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  cuum = 0;.  sqli
302b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
302c0 3d 20 30 3b 0a 0a 20 20 73 68 65 6c 6c 45 78 65  = 0;..  shellExe
302d0 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  cPrintf(pState->
302e0 64 62 2c 20 26 72 63 2c 20 22 41 54 54 41 43 48  db, &rc, "ATTACH
302f0 20 27 25 71 27 20 41 53 20 5f 73 68 61 72 65 64   '%q' AS _shared
30300 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20 7a 44  _schema_tmp", zD
30310 62 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50  b);.  shellExecP
30320 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
30330 2c 20 26 72 63 2c 20 22 50 52 41 47 4d 41 20 77  , &rc, "PRAGMA w
30340 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
30350 20 31 22 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65   1");.  shellExe
30360 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  cPrintf(pState->
30370 64 62 2c 20 26 72 63 2c 20 22 42 45 47 49 4e 22  db, &rc, "BEGIN"
30380 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  );.  shellPrepar
30390 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
303a0 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  db, &rc, &pStmt,
303b0 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
303c0 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
303d0 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74  _shared_schema_t
303e0 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  mp.sqlite_master
303f0 22 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ".  );.  sqlite3
30400 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
30410 69 4c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  iLast = sqlite3_
30420 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
30430 6d 74 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c 46  mt, 0);.  shellF
30440 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74  inalize(&rc, pSt
30450 6d 74 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70  mt);.  shellPrep
30460 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
30470 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d  ->db, &rc, &pStm
30480 74 2c 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54  t,.      "INSERT
30490 20 49 4e 54 4f 20 5f 73 68 61 72 65 64 5f 73 63   INTO _shared_sc
304a0 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f  hema_tmp.sqlite_
304b0 6d 61 73 74 65 72 20 53 45 4c 45 43 54 20 22 0a  master SELECT ".
304c0 20 20 20 20 20 20 22 20 20 74 79 70 65 2c 20 6e        "  type, n
304d0 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 28  ame, tbl_name, (
304e0 22 0a 20 20 20 20 20 20 22 20 20 20 20 53 45 4c  ".      "    SEL
304f0 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
30500 4d 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61  M _shared_schema
30510 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74  _tmp.sqlite_mast
30520 65 72 20 57 48 45 52 45 20 22 0a 20 20 20 20 20  er WHERE ".     
30530 20 22 20 20 20 20 20 20 74 79 70 65 20 49 53 20   "      type IS 
30540 6f 2e 74 79 70 65 20 41 4e 44 20 6e 61 6d 65 20  o.type AND name 
30550 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 72 6f  IS o.name AND ro
30560 77 69 64 3c 3d 3f 22 0a 20 20 20 20 20 20 22 20  wid<=?".      " 
30570 20 29 2c 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69   ), sql FROM mai
30580 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
30590 41 53 20 6f 22 0a 20 20 29 3b 0a 20 20 73 71 6c  AS o".  );.  sql
305a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
305b0 70 53 74 6d 74 2c 20 31 2c 20 69 4c 61 73 74 29  pStmt, 1, iLast)
305c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
305d0 28 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c 6c  (pStmt);.  shell
305e0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
305f0 74 6d 74 29 3b 0a 0a 20 20 73 68 65 6c 6c 45 78  tmt);..  shellEx
30600 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
30610 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20  >db, &rc,.      
30620 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5f 73 68  "DELETE FROM _sh
30630 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e  ared_schema_tmp.
30640 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
30650 45 52 45 20 72 6f 77 69 64 3c 3d 25 6c 6c 64 22  ERE rowid<=%lld"
30660 2c 0a 20 20 20 20 20 20 69 4c 61 73 74 0a 20 20  ,.      iLast.  
30670 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72  );.  shellExecPr
30680 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
30690 20 26 72 63 2c 20 22 43 4f 4d 4d 49 54 22 29 3b   &rc, "COMMIT");
306a0 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
306b0 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 50 52 41  pState->db, "PRA
306c0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
306d0 65 6d 61 20 3d 20 30 22 2c 20 30 2c 20 30 2c 20  ema = 0", 0, 0, 
306e0 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74  0);..  /* Copy t
306f0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 73  he auto-vacuum s
30700 65 74 74 69 6e 67 20 66 72 6f 6d 20 6d 61 69 6e  etting from main
30710 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 64   to the target d
30720 62 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  b */.  shellPrep
30730 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
30740 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d  ->db, &rc, &pStm
30750 74 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  t, "PRAGMA main.
30760 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20  auto_vacuum");. 
30770 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
30780 74 6d 74 29 3b 0a 20 20 69 41 75 74 6f 56 61 63  tmt);.  iAutoVac
30790 75 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  uum = sqlite3_co
307a0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
307b0 30 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c  0);.  shellFinal
307c0 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
307d0 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e  .  shellExecPrin
307e0 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  tf(pState->db, &
307f0 72 63 2c 20 0a 20 20 20 20 20 20 22 50 52 41 47  rc, .      "PRAG
30800 4d 41 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d  MA _shared_schem
30810 61 5f 74 6d 70 2e 61 75 74 6f 5f 76 61 63 75 75  a_tmp.auto_vacuu
30820 6d 20 3d 20 25 64 22 2c 20 69 41 75 74 6f 56 61  m = %d", iAutoVa
30830 63 75 75 6d 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  cuum.  );..  /* 
30840 56 61 63 75 75 6d 20 74 68 65 20 64 62 20 69 6e  Vacuum the db in
30850 20 6f 72 64 65 72 20 74 6f 20 73 74 61 6e 64 61   order to standa
30860 72 64 69 7a 65 20 74 68 65 20 72 6f 6f 74 70 61  rdize the rootpa
30870 67 65 20 6e 75 6d 62 65 72 73 2e 20 2a 2f 0a 20  ge numbers. */. 
30880 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66   shellExecPrintf
30890 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
308a0 2c 20 22 56 41 43 55 55 4d 20 5f 73 68 61 72 65  , "VACUUM _share
308b0 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 29 3b 0a  d_schema_tmp");.
308c0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 63  .  /* Set the sc
308d0 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 76 61 6c 75  hema-cookie valu
308e0 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 61 73  e to the same as
308f0 20 64 61 74 61 62 61 73 65 20 22 6d 61 69 6e 22   database "main"
30900 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   */.  shellPrepa
30910 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
30920 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
30930 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73  , "PRAGMA main.s
30940 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 29 3b  chema_version");
30950 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
30960 70 53 74 6d 74 29 3b 0a 20 20 69 43 6f 6f 6b 69  pStmt);.  iCooki
30970 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
30980 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
30990 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  ;.  shellFinaliz
309a0 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
309b0 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66   shellExecPrintf
309c0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
309d0 2c 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d 41  , .      "PRAGMA
309e0 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f   _shared_schema_
309f0 74 6d 70 2e 73 63 68 65 6d 61 5f 76 65 72 73 69  tmp.schema_versi
30a00 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69  on = %d", iCooki
30a10 65 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  e.  );..  sqlite
30a20 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d 3e 64  3_exec(pState->d
30a30 62 2c 20 22 44 45 54 41 43 48 20 5f 73 68 61 72  b, "DETACH _shar
30a40 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20  ed_schema_tmp", 
30a50 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  0, 0, 0);.  retu
30a60 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
30a70 20 69 6e 74 20 73 68 61 72 65 64 53 63 68 65 6d   int sharedSchem
30a80 61 43 68 65 63 6b 28 53 68 65 6c 6c 53 74 61 74  aCheck(ShellStat
30a90 65 20 2a 70 53 74 61 74 65 2c 20 63 6f 6e 73 74  e *pState, const
30aa0 20 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e 74 20   char *zDb, int 
30ab0 2a 70 65 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  *peFix){.  int r
30ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30ad0 20 69 6e 74 20 62 46 61 69 6c 65 64 20 3d 20 30   int bFailed = 0
30ae0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
30af0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20   *pStmt = 0;..  
30b00 69 66 28 20 70 65 46 69 78 20 29 20 2a 70 65 46  if( peFix ) *peF
30b10 69 78 20 3d 20 30 3b 0a 20 20 73 68 65 6c 6c 45  ix = 0;.  shellE
30b20 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65  xecPrintf(pState
30b30 2d 3e 64 62 2c 20 26 72 63 2c 20 22 41 54 54 41  ->db, &rc, "ATTA
30b40 43 48 20 27 25 71 27 20 41 53 20 5f 73 68 61 72  CH '%q' AS _shar
30b50 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20  ed_schema_tmp", 
30b60 7a 44 62 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  zDb);..  /* Chec
30b70 6b 20 69 66 20 74 68 69 73 20 64 61 74 61 62 61  k if this databa
30b80 73 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  se has the same 
30b90 73 65 74 20 6f 66 20 6f 62 6a 65 63 74 73 20 61  set of objects a
30ba0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 62  s the current db
30bb0 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   */.  shellPrepa
30bc0 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
30bd0 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
30be0 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74  , .    "SELECT t
30bf0 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 5f  ype, name FROM _
30c00 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d  shared_schema_tm
30c10 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  p.sqlite_master 
30c20 41 53 20 6f 20 22 0a 20 20 20 20 22 57 48 45 52  AS o ".    "WHER
30c30 45 20 4e 4f 54 20 45 58 49 53 54 53 20 28 22 0a  E NOT EXISTS (".
30c40 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 31 20      "  SELECT 1 
30c50 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
30c60 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 22 20  _master ".    " 
30c70 20 20 20 57 48 45 52 45 20 6e 61 6d 65 20 49 53     WHERE name IS
30c80 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70 65   o.name AND type
30c90 20 49 53 20 6f 2e 74 79 70 65 22 0a 20 20 20 20   IS o.type".    
30ca0 22 29 22 0a 20 20 20 20 22 20 55 4e 49 4f 4e 20  ")".    " UNION 
30cb0 41 4c 4c 20 22 0a 20 20 20 20 22 53 45 4c 45 43  ALL ".    "SELEC
30cc0 54 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f  T type, name FRO
30cd0 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
30ce0 73 74 65 72 20 41 53 20 6f 20 22 0a 20 20 20 20  ster AS o ".    
30cf0 22 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54  "WHERE NOT EXIST
30d00 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45  S (".    "  SELE
30d10 43 54 20 31 20 46 52 4f 4d 20 5f 73 68 61 72 65  CT 1 FROM _share
30d20 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c  d_schema_tmp.sql
30d30 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
30d40 20 22 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65   "    WHERE name
30d50 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74   IS o.name AND t
30d60 79 70 65 20 49 53 20 6f 2e 74 79 70 65 22 0a 20  ype IS o.type". 
30d70 20 20 20 22 29 22 0a 20 20 29 3b 0a 20 20 69 66     ")".  );.  if
30d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30d90 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
30da0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
30db0 74 29 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  t) ){.    utf8_p
30dc0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
30dd0 74 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f  t, "%s is NOT co
30de0 6d 70 61 74 69 62 6c 65 20 28 6f 62 6a 65 63 74  mpatible (object
30df0 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20 20 20  s)\n", zDb);.   
30e00 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20   bFailed = 1;.  
30e10 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  }.  shellFinaliz
30e20 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a  e(&rc, pStmt);..
30e30 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
30e40 69 73 20 64 61 74 61 62 61 73 65 20 68 61 73 20  is database has 
30e50 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
30e60 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
30e70 73 20 74 68 65 20 0a 20 20 2a 2a 20 63 75 72 72  s the .  ** curr
30e80 65 6e 74 20 64 62 2e 20 2a 2f 0a 20 20 69 66 28  ent db. */.  if(
30e90 20 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20   bFailed==0 ){. 
30ea0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
30eb0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
30ec0 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
30ed0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
30ee0 31 20 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73  1 FROM _shared_s
30ef0 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65  chema_tmp.sqlite
30f00 5f 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20  _master AS o ". 
30f10 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
30f20 6c 20 49 53 20 4e 4f 54 20 28 22 0a 20 20 20 20  l IS NOT (".    
30f30 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 71      "  SELECT sq
30f40 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69  l FROM main.sqli
30f50 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
30f60 20 20 20 20 22 20 20 20 20 57 48 45 52 45 20 6e      "    WHERE n
30f70 61 6d 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e  ame IS o.name AN
30f80 44 20 74 79 70 65 20 49 53 20 6f 2e 74 79 70 65  D type IS o.type
30f90 22 0a 20 20 20 20 20 20 20 20 22 29 22 0a 20 20  ".        ")".  
30fa0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
30fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
30fc0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
30fd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
30fe0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
30ff0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
31000 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70 61  "%s is NOT compa
31010 74 69 62 6c 65 20 28 53 51 4c 29 5c 6e 22 2c 20  tible (SQL)\n", 
31020 7a 44 62 29 3b 0a 20 20 20 20 20 20 62 46 61 69  zDb);.      bFai
31030 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
31040 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
31050 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (&rc, pStmt);.  
31060 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
31070 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
31080 61 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  as the same set 
31090 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 61 73  of root pages as
310a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
310b0 2a 2a 20 64 62 2e 20 2a 2f 0a 20 20 69 66 28 20  ** db. */.  if( 
310c0 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  bFailed==0 ){.  
310d0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
310e0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
310f0 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   &rc, &pStmt, . 
31100 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31         "SELECT 1
31110 20 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63   FROM _shared_sc
31120 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f  hema_tmp.sqlite_
31130 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20 20  master AS o ".  
31140 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 6f        "WHERE roo
31150 74 70 61 67 65 20 49 53 20 4e 4f 54 20 28 22 0a  tpage IS NOT (".
31160 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
31170 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
31180 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
31190 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 20 20  er ".        "  
311a0 20 20 57 48 45 52 45 20 6e 61 6d 65 20 49 53 20    WHERE name IS 
311b0 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70 65 20  o.name AND type 
311c0 49 53 20 6f 2e 74 79 70 65 22 0a 20 20 20 20 20  IS o.type".     
311d0 20 20 20 22 29 22 0a 20 20 20 20 29 3b 0a 20 20     ")".    );.  
311e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
311f0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
31200 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
31210 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
31220 69 66 28 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a  if( peFix==0 ){.
31230 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31240 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
31250 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70   "%s is NOT comp
31260 61 74 69 62 6c 65 20 28 72 6f 6f 74 20 70 61 67  atible (root pag
31270 65 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20 20  es)\n", zDb);.  
31280 20 20 20 20 7d 0a 20 20 20 20 20 20 62 46 61 69      }.      bFai
31290 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  led = 1;.      i
312a0 66 28 20 70 65 46 69 78 20 29 20 2a 70 65 46 69  f( peFix ) *peFi
312b0 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
312c0 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
312d0 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  rc, pStmt);.  }.
312e0 0a 20 20 69 66 28 20 62 46 61 69 6c 65 64 3d 3d  .  if( bFailed==
312f0 30 20 29 7b 0a 20 20 20 20 73 68 65 6c 6c 50 72  0 ){.    shellPr
31300 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61  eparePrintf(pSta
31310 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  te->db, &rc, &pS
31320 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 22 53  tmt, .        "S
31330 45 4c 45 43 54 20 31 20 57 48 45 52 45 20 28 22  ELECT 1 WHERE ("
31340 0a 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45  .        "  SELE
31350 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
31360 72 6f 6f 74 70 61 67 65 20 7c 7c 20 27 2e 27 20  rootpage || '.' 
31370 7c 7c 20 6e 61 6d 65 20 7c 7c 20 27 2e 27 20 7c  || name || '.' |
31380 7c 20 73 71 6c 2c 20 27 2e 27 29 20 22 0a 20 20  | sql, '.') ".  
31390 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 5f 73        "  FROM _s
313a0 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
313b0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
313c0 20 20 20 20 20 20 20 20 22 29 20 49 53 20 4e 4f          ") IS NO
313d0 54 20 28 22 0a 20 20 20 20 20 20 20 20 22 20 20  T (".        "  
313e0 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
313f0 63 61 74 28 72 6f 6f 74 70 61 67 65 20 7c 7c 20  cat(rootpage || 
31400 27 2e 27 20 7c 7c 20 6e 61 6d 65 20 7c 7c 20 27  '.' || name || '
31410 2e 27 20 7c 7c 20 73 71 6c 2c 20 27 2e 27 29 20  .' || sql, '.') 
31420 22 0a 20 20 20 20 20 20 20 20 22 20 20 46 52 4f  ".        "  FRO
31430 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
31440 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 22 29  ster".        ")
31450 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ".    );.    if(
31460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31470 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
31480 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
31490 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
314a0 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eFix==0 ){.     
314b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
314c0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20  State->out, .   
314d0 20 20 20 20 20 20 20 20 20 22 25 73 20 69 73 20           "%s is 
314e0 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c 65 20 28  NOT compatible (
314f0 6f 72 64 65 72 20 6f 66 20 73 71 6c 69 74 65 5f  order of sqlite_
31500 6d 61 73 74 65 72 20 72 6f 77 73 29 5c 6e 22 2c  master rows)\n",
31510 20 7a 44 62 0a 20 20 20 20 20 20 20 20 29 3b 0a   zDb.        );.
31520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 46        }.      bF
31530 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
31540 20 69 66 28 20 70 65 46 69 78 20 29 20 2a 70 65   if( peFix ) *pe
31550 46 69 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  Fix = 2;.    }. 
31560 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
31570 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (&rc, pStmt);.  
31580 7d 0a 0a 20 20 69 66 28 20 62 46 61 69 6c 65 64  }..  if( bFailed
31590 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
315a0 4d 61 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69  Main = -1;.    i
315b0 6e 74 20 69 4e 65 77 20 3d 20 2b 31 3b 0a 20 20  nt iNew = +1;.  
315c0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
315d0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
315e0 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   &rc, &pStmt, . 
315f0 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6d         "PRAGMA m
31600 61 69 6e 2e 73 63 68 65 6d 61 5f 76 65 72 73 69  ain.schema_versi
31610 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  on".    );.    i
31620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31630 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
31640 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
31650 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 4d 61  mt) ){.      iMa
31660 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  in = sqlite3_col
31670 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
31680 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65  );.    }.    she
31690 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
316a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 68 65 6c  pStmt);.    shel
316b0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
316c0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20  State->db, &rc, 
316d0 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20  &pStmt, .       
316e0 20 22 50 52 41 47 4d 41 20 5f 73 68 61 72 65 64   "PRAGMA _shared
316f0 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 63 68 65  _schema_tmp.sche
31700 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20  ma_version".    
31710 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
31720 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
31730 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
31740 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
31750 20 20 20 20 20 69 4e 65 77 20 3d 20 73 71 6c 69       iNew = sqli
31760 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
31770 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
31780 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
31790 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
317a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
317b0 45 5f 4f 4b 20 26 26 20 69 4d 61 69 6e 21 3d 69  E_OK && iMain!=i
317c0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  New ){.      if(
317d0 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20 20   peFix==0 ){.   
317e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
317f0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20  (pState->out, . 
31800 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 69             "%s i
31810 73 20 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c 65  s NOT compatible
31820 20 28 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 29   (schema cookie)
31830 5c 6e 22 2c 20 7a 44 62 0a 20 20 20 20 20 20 20  \n", zDb.       
31840 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
31850 20 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20    bFailed = 1;. 
31860 20 20 20 20 20 69 66 28 20 70 65 46 69 78 20 29       if( peFix )
31870 20 2a 70 65 46 69 78 20 3d 20 33 3b 0a 20 20 20   *peFix = 3;.   
31880 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
31890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
318a0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
318b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74   utf8_printf(pSt
318c0 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 20 69 73  ate->out, "%s is
318d0 20 63 6f 6d 70 61 74 69 62 6c 65 5c 6e 22 2c 20   compatible\n", 
318e0 7a 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  zDb);.  }..  sql
318f0 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65  ite3_exec(pState
31900 2d 3e 64 62 2c 20 22 44 45 54 41 43 48 20 5f 73  ->db, "DETACH _s
31910 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
31920 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72  ", 0, 0, 0);.  r
31930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31940 2a 2a 20 2e 73 68 61 72 65 64 2d 73 63 68 65 6d  ** .shared-schem
31950 61 20 63 68 65 63 6b 7c 66 69 78 20 44 42 31 20  a check|fix DB1 
31960 44 42 32 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  DB2....*/.static
31970 20 69 6e 74 20 73 68 61 72 65 64 53 63 68 65 6d   int sharedSchem
31980 61 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  aDotCommand(.  S
31990 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
319a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
319b0 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
319c0 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
319d0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
31a00 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
31a10 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
31a20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
31a50 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
31a60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
31a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
31a80 6e 74 20 62 46 69 78 20 3d 20 30 3b 20 20 20 20  nt bFix = 0;    
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31aa0 2a 20 46 69 78 20 64 61 74 61 62 61 73 65 73 20  * Fix databases 
31ab0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
31ac0 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 69   int n1;.  int i
31ad0 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29  ;.  if( nArg<3 )
31ae0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 68 61 72 65  {.    goto share
31af0 64 5f 73 63 68 65 6d 61 5f 75 73 61 67 65 3b 0a  d_schema_usage;.
31b00 20 20 7d 0a 0a 20 20 6e 31 20 3d 20 28 69 6e 74    }..  n1 = (int
31b10 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 31 5d  )strlen(azArg[1]
31b20 29 3b 0a 20 20 69 66 28 20 6e 31 3e 30 20 26 26  );.  if( n1>0 &&
31b30 20 6e 31 3c 3d 33 20 26 26 20 6d 65 6d 63 6d 70   n1<=3 && memcmp
31b40 28 22 66 69 78 22 2c 20 61 7a 41 72 67 5b 31 5d  ("fix", azArg[1]
31b50 2c 20 6e 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n1)==0 ){.    
31b60 62 46 69 78 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bFix = 1;.  }els
31b70 65 20 69 66 28 20 6e 31 3d 3d 30 20 7c 7c 20 6e  e if( n1==0 || n
31b80 31 3e 35 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 63  1>5 || memcmp("c
31b90 68 65 63 6b 22 2c 20 61 7a 41 72 67 5b 31 5d 2c  heck", azArg[1],
31ba0 20 6e 31 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   n1) ){.    goto
31bb0 20 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 75   shared_schema_u
31bc0 73 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  sage;.  }..  for
31bd0 28 69 3d 32 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=2; rc==SQLITE
31be0 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69  _OK && i<nArg; i
31bf0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65 46 69  ++){.    int eFi
31c00 78 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  x = 0;.    rc = 
31c10 73 68 61 72 65 64 53 63 68 65 6d 61 43 68 65 63  sharedSchemaChec
31c20 6b 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b  k(pState, azArg[
31c30 69 5d 2c 20 62 46 69 78 20 3f 20 26 65 46 69 78  i], bFix ? &eFix
31c40 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
31c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31c60 62 46 69 78 20 26 26 20 65 46 69 78 20 29 7b 0a  bFix && eFix ){.
31c70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31c80 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
31c90 46 69 78 69 6e 67 20 25 73 2e 2e 2e 20 22 2c 20  Fixing %s... ", 
31ca0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
31cb0 20 66 66 6c 75 73 68 28 70 53 74 61 74 65 2d 3e   fflush(pState->
31cc0 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  out);.      rc =
31cd0 20 73 68 61 72 65 64 53 63 68 65 6d 61 46 69 78   sharedSchemaFix
31ce0 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b 69  (pState, azArg[i
31cf0 5d 2c 20 65 46 69 78 29 3b 0a 20 20 20 20 20 20  ], eFix);.      
31d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
31d20 3d 20 73 68 61 72 65 64 53 63 68 65 6d 61 43 68  = sharedSchemaCh
31d30 65 63 6b 28 70 53 74 61 74 65 2c 20 61 7a 41 72  eck(pState, azAr
31d40 67 5b 69 5d 2c 20 26 65 46 69 78 29 3b 0a 20 20  g[i], &eFix);.  
31d50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31d60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 78 20  LITE_OK && eFix 
31d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
31d80 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
31d90 3e 6f 75 74 2c 20 22 56 41 43 55 55 4d 69 6e 67  >out, "VACUUMing
31da0 20 6d 61 69 6e 2e 2e 2e 20 22 29 3b 0a 20 20 20   main... ");.   
31db0 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 70 53         fflush(pS
31dc0 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
31dd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31de0 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d 3e  e3_exec(pState->
31df0 64 62 2c 20 22 56 41 43 55 55 4d 20 6d 61 69 6e  db, "VACUUM main
31e00 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
31e10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 61          rc = sha
31e40 72 65 64 53 63 68 65 6d 61 43 68 65 63 6b 28 70  redSchemaCheck(p
31e50 53 74 61 74 65 2c 20 61 7a 41 72 67 5b 69 5d 2c  State, azArg[i],
31e60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
31e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31e80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
31e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 73 68 61 72  return rc;. shar
31ea0 65 64 5f 73 63 68 65 6d 61 5f 75 73 61 67 65 3a  ed_schema_usage:
31eb0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
31ec0 64 65 72 72 2c 20 22 75 73 61 67 65 3a 20 2e 73  derr, "usage: .s
31ed0 68 61 72 65 64 2d 73 63 68 65 6d 61 20 63 68 65  hared-schema che
31ee0 63 6b 7c 66 69 78 20 44 42 31 20 44 42 32 2e 2e  ck|fix DB1 DB2..
31ef0 2e 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  .\n");.  return 
31f00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
31f10 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e  ./*.** When runn
31f20 69 6e 67 20 74 68 65 20 22 2e 72 65 63 6f 76 65  ing the ".recove
31f30 72 22 20 63 6f 6d 6d 61 6e 64 2c 20 65 61 63 68  r" command, each
31f40 20 6f 75 74 70 75 74 20 74 61 62 6c 65 2c 20 61   output table, a
31f50 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  nd the special.*
31f60 2a 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 20 74  * orphaned row t
31f70 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 72 65  able if it is re
31f80 71 75 69 72 65 64 2c 20 69 73 20 72 65 70 72 65  quired, is repre
31f90 73 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73  sented by an ins
31fa0 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
31fb0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
31fc0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
31fd0 75 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65  uct RecoverTable
31fe0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 3b 0a 73   RecoverTable;.s
31ff0 74 72 75 63 74 20 52 65 63 6f 76 65 72 54 61 62  truct RecoverTab
32000 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a 51 75  le {.  char *zQu
32010 6f 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  oted;           
32020 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 64         /* Quoted
32030 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 61 62 6c   version of tabl
32040 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
32050 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
32060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32070 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
32080 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63   in table */.  c
32090 68 61 72 20 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20  har **azlCol;   
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
320b0 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
320c0 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74  n lists */.  int
320d0 20 69 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   iPk;           
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
320f0 49 6e 64 65 78 20 6f 66 20 49 50 4b 20 63 6f 6c  Index of IPK col
32100 75 6d 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  umn */.};../*.**
32110 20 46 72 65 65 20 61 20 52 65 63 6f 76 65 72 54   Free a RecoverT
32120 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  able object allo
32130 63 61 74 65 64 20 62 79 20 72 65 63 6f 76 65 72  cated by recover
32140 46 69 6e 64 54 61 62 6c 65 28 29 20 6f 72 0a 2a  FindTable() or.*
32150 2a 20 72 65 63 6f 76 65 72 4f 72 70 68 61 6e 54  * recoverOrphanT
32160 61 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  able()..*/.stati
32170 63 20 76 6f 69 64 20 72 65 63 6f 76 65 72 46 72  c void recoverFr
32180 65 65 54 61 62 6c 65 28 52 65 63 6f 76 65 72 54  eeTable(RecoverT
32190 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 69  able *pTab){.  i
321a0 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 73  f( pTab ){.    s
321b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
321c0 2d 3e 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  ->zQuoted);.    
321d0 69 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c  if( pTab->azlCol
321e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
321f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
32200 69 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  i<=pTab->nCol; i
32210 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
32220 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
32230 61 7a 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  azlCol[i]);.    
32240 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
32250 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c  3_free(pTab->azl
32260 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
32270 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
32280 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
32290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
322a0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 28 2a 70  s a no-op if (*p
322b0 52 63 29 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  Rc) is not SQLIT
322c0 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20  E_OK when it is 
322d0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  called..** Other
322e0 77 69 73 65 2c 20 69 74 20 61 6c 6c 6f 63 61 74  wise, it allocat
322f0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
32300 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62   RecoverTable ob
32310 6a 65 63 74 20 62 61 73 65 64 20 6f 6e 20 74 68  ject based on th
32320 65 0a 2a 2a 20 66 69 6e 61 6c 20 66 6f 75 72 20  e.** final four 
32330 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
32340 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
32350 6e 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  n. It is the res
32360 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f  ponsibility.** o
32370 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
32380 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
32390 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
323a0 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 72 65 63  ect using.** rec
323b0 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 29 2e  overFreeTable().
323c0 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76  .*/.static Recov
323d0 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72  erTable *recover
323e0 4e 65 77 54 61 62 6c 65 28 0a 20 20 69 6e 74 20  NewTable(.  int 
323f0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
32400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32410 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
32420 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
32430 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
32440 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32450 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  f table */.  con
32460 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32480 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
32490 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
324a0 62 49 6e 74 6b 65 79 2c 20 0a 20 20 69 6e 74 20  bIntkey, .  int 
324b0 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  nCol.){.  sqlite
324c0 33 20 2a 64 62 74 6d 70 20 3d 20 30 3b 20 20 20  3 *dbtmp = 0;   
324d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
324e0 69 74 65 33 20 68 61 6e 64 6c 65 20 66 6f 72 20  ite3 handle for 
324f0 74 65 73 74 69 6e 67 20 43 52 45 41 54 45 20 54  testing CREATE T
32500 41 42 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ABLE */.  int rc
32510 20 3d 20 2a 70 52 63 3b 0a 20 20 52 65 63 6f 76   = *pRc;.  Recov
32520 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  erTable *pTab = 
32530 30 3b 0a 0a 20 20 70 54 61 62 20 3d 20 28 52 65  0;..  pTab = (Re
32540 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c  coverTable*)shel
32550 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a  lMalloc(&rc, siz
32560 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65  eof(RecoverTable
32570 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
32580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
32590 6e 74 20 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a  nt nSqlCol = 0;.
325a0 20 20 20 20 69 6e 74 20 62 53 71 6c 49 6e 74 6b      int bSqlIntk
325b0 65 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ey = 0;.    sqli
325c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
325d0 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 72 63  = 0;.    .    rc
325e0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
325f0 22 22 2c 20 26 64 62 74 6d 70 29 3b 0a 20 20 20  "", &dbtmp);.   
32600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
32620 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
32630 69 6f 6e 28 64 62 74 6d 70 2c 20 22 73 68 65 6c  ion(dbtmp, "shel
32640 6c 5f 69 64 71 75 6f 74 65 22 2c 20 31 2c 20 53  l_idquote", 1, S
32650 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
32660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
32680 6c 6c 49 64 51 75 6f 74 65 2c 20 30 2c 20 30 29  llIdQuote, 0, 0)
32690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
326a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
326b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
326c0 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20  te3_exec(dbtmp, 
326d0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
326e0 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 22 2c 20 30  _schema = on", 0
326f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
32700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
32720 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
32730 64 62 74 6d 70 2c 20 7a 53 71 6c 2c 20 30 2c 20  dbtmp, zSql, 0, 
32740 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
32750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
32760 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  R ){.        rc 
32770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32780 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68       goto finish
32790 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
327a0 7d 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  }.    shellPrepa
327b0 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
327c0 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
327d0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
327e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 72 61 67  unt(*) FROM prag
327f0 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51  ma_table_info(%Q
32800 29 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  )", zName.    );
32810 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32820 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
32830 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
32840 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
32850 20 20 20 6e 53 71 6c 43 6f 6c 20 3d 20 73 71 6c     nSqlCol = sql
32860 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
32870 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
32880 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
32890 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
328a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
328b0 49 54 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c 43 6f  ITE_OK || nSqlCo
328c0 6c 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  l<nCol ){.      
328d0 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
328e0 20 20 20 7d 0a 0a 20 20 20 20 73 68 65 6c 6c 50     }..    shellP
328f0 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74  reparePrintf(dbt
32900 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  mp, &rc, &pStmt,
32910 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
32920 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45  (".      "  SELE
32930 43 54 20 73 75 62 73 74 72 28 64 61 74 61 2c 31  CT substr(data,1
32940 2c 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20  ,1)==X'0D' FROM 
32950 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48  sqlite_dbpage WH
32960 45 52 45 20 70 67 6e 6f 3d 72 6f 6f 74 70 61 67  ERE pgno=rootpag
32970 65 22 0a 20 20 20 20 20 20 22 29 20 46 52 4f 4d  e".      ") FROM
32980 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
32990 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c  HERE name = %Q",
329a0 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20   zName.    );.  
329b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
329c0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
329d0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
329e0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
329f0 62 53 71 6c 49 6e 74 6b 65 79 20 3d 20 73 71 6c  bSqlIntkey = sql
32a00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
32a10 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
32a20 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
32a30 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
32a40 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79  .    if( bIntkey
32a50 3d 3d 62 53 71 6c 49 6e 74 6b 65 79 20 29 7b 0a  ==bSqlIntkey ){.
32a60 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
32a70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32a80 50 6b 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a  Pk = "_rowid_";.
32a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
32aa0 6d 74 20 2a 70 50 6b 46 69 6e 64 65 72 20 3d 20  mt *pPkFinder = 
32ab0 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  0;..      /* If 
32ac0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 6b 65  this is an intke
32ad0 79 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72  y table and ther
32ae0 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  e is an INTEGER 
32af0 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
32b00 20 20 20 2a 2a 20 73 65 74 20 7a 50 6b 20 74 6f     ** set zPk to
32b10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
32b20 20 50 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20   PK column, and 
32b30 70 54 61 62 2d 3e 69 50 6b 20 74 6f 20 74 68 65  pTab->iPk to the
32b40 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2a 20   index.      ** 
32b50 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 77  of the column, w
32b60 68 65 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65  here columns are
32b70 20 30 2d 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d   0-numbered from
32b80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
32b90 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
32ba0 74 68 69 73 20 69 73 20 61 20 57 49 54 48 4f 55  this is a WITHOU
32bb0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 6f 72  T ROWID table or
32bc0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
32bd0 49 50 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  IPK column,.    
32be0 20 20 2a 2a 20 6c 65 61 76 65 20 7a 50 6b 20 61    ** leave zPk a
32bf0 73 20 22 5f 72 6f 77 69 64 5f 22 20 61 6e 64 20  s "_rowid_" and 
32c00 70 54 61 62 2d 3e 69 50 6b 20 61 74 20 2d 32 2e  pTab->iPk at -2.
32c10 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d    */.      pTab-
32c20 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20  >iPk = -2;.     
32c30 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a   if( bIntkey ){.
32c40 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65          shellPre
32c50 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
32c60 2c 20 26 72 63 2c 20 26 70 50 6b 46 69 6e 64 65  , &rc, &pPkFinde
32c70 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 53  r, .          "S
32c80 45 4c 45 43 54 20 63 69 64 2c 20 6e 61 6d 65 20  ELECT cid, name 
32c90 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c  FROM pragma_tabl
32ca0 65 5f 69 6e 66 6f 28 25 51 29 20 22 0a 20 20 20  e_info(%Q) ".   
32cb0 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20         "  WHERE 
32cc0 70 6b 3d 31 20 41 4e 44 20 74 79 70 65 3d 27 69  pk=1 AND type='i
32cd0 6e 74 65 67 65 72 27 20 43 4f 4c 4c 41 54 45 20  nteger' COLLATE 
32ce0 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
32cf0 20 20 22 20 20 41 4e 44 20 4e 4f 54 20 45 58 49    "  AND NOT EXI
32d00 53 54 53 20 28 53 45 4c 45 43 54 20 63 69 64 20  STS (SELECT cid 
32d10 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c  FROM pragma_tabl
32d20 65 5f 69 6e 66 6f 28 25 51 29 20 57 48 45 52 45  e_info(%Q) WHERE
32d30 20 70 6b 3d 32 29 22 0a 20 20 20 20 20 20 20 20   pk=2)".        
32d40 20 20 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65    , zName, zName
32d50 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
32d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32d70 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
32d80 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
32d90 70 28 70 50 6b 46 69 6e 64 65 72 29 20 29 7b 0a  p(pPkFinder) ){.
32da0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
32db0 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
32dc0 6c 75 6d 6e 5f 69 6e 74 28 70 50 6b 46 69 6e 64  lumn_int(pPkFind
32dd0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
32de0 20 20 7a 50 6b 20 3d 20 28 63 6f 6e 73 74 20 63    zPk = (const c
32df0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
32e00 75 6d 6e 5f 74 65 78 74 28 70 50 6b 46 69 6e 64  umn_text(pPkFind
32e10 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
32e20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
32e30 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d   pTab->zQuoted =
32e40 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72   shellMPrintf(&r
32e50 63 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 4e 61  c, "\"%w\"", zNa
32e60 6d 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  me);.      pTab-
32e70 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a  >azlCol = (char*
32e80 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72  *)shellMalloc(&r
32e90 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  c, sizeof(char*)
32ea0 20 2a 20 28 6e 53 71 6c 43 6f 6c 2b 31 29 29 3b   * (nSqlCol+1));
32eb0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
32ec0 6c 20 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a 20 20  l = nSqlCol;..  
32ed0 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20      if( bIntkey 
32ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
32ef0 3e 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65  >azlCol[0] = she
32f00 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22  llMPrintf(&rc, "
32f10 5c 22 25 77 5c 22 22 2c 20 7a 50 6b 29 3b 0a 20  \"%w\"", zPk);. 
32f20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32f30 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c      pTab->azlCol
32f40 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e  [0] = shellMPrin
32f50 74 66 28 26 72 63 2c 20 22 22 29 3b 0a 20 20 20  tf(&rc, "");.   
32f60 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 31     }.      i = 1
32f70 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65  ;.      shellPre
32f80 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
32f90 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
32fa0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
32fb0 54 20 25 51 20 7c 7c 20 67 72 6f 75 70 5f 63 6f  T %Q || group_co
32fc0 6e 63 61 74 28 73 68 65 6c 6c 5f 69 64 71 75 6f  ncat(shell_idquo
32fd0 74 65 28 6e 61 6d 65 29 2c 20 27 2c 20 27 29 20  te(name), ', ') 
32fe0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
32ff0 49 4c 54 45 52 20 28 57 48 45 52 45 20 63 69 64  ILTER (WHERE cid
33000 21 3d 25 64 29 20 4f 56 45 52 20 28 4f 52 44 45  !=%d) OVER (ORDE
33010 52 20 42 59 20 25 73 20 63 69 64 29 20 22 0a 20  R BY %s cid) ". 
33020 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 70           "FROM p
33030 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f  ragma_table_info
33040 28 25 51 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%Q)", .        
33050 20 20 62 49 6e 74 6b 65 79 20 3f 20 22 2c 20 22    bIntkey ? ", "
33060 20 3a 20 22 22 2c 20 70 54 61 62 2d 3e 69 50 6b   : "", pTab->iPk
33070 2c 20 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  , .          bIn
33080 74 6b 65 79 20 3f 20 22 22 20 3a 20 22 28 43 41  tkey ? "" : "(CA
33090 53 45 20 57 48 45 4e 20 70 6b 3d 30 20 54 48 45  SE WHEN pk=0 THE
330a0 4e 20 31 30 30 30 30 30 30 20 45 4c 53 45 20 70  N 1000000 ELSE p
330b0 6b 20 45 4e 44 29 2c 20 22 2c 0a 20 20 20 20 20  k END), ",.     
330c0 20 20 20 20 20 7a 4e 61 6d 65 0a 20 20 20 20 20       zName.     
330d0 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
330e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
330f0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
33100 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
33110 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
33120 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
33130 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
33140 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
33150 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
33160 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f       pTab->azlCo
33170 6c 5b 69 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69  l[i] = shellMPri
33180 6e 74 66 28 26 72 63 2c 20 22 25 73 25 73 22 2c  ntf(&rc, "%s%s",
33190 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d   pTab->azlCol[0]
331a0 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  , zText);.      
331b0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
331c0 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69       shellFinali
331d0 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
331e0 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61  .      shellFina
331f0 6c 69 7a 65 28 26 72 63 2c 20 70 50 6b 46 69 6e  lize(&rc, pPkFin
33200 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  der);.    }.  }.
33210 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71  . finished:.  sq
33220 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 74 6d  lite3_close(dbtm
33230 70 29 3b 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b  p);.  *pRc = rc;
33240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33250 45 5f 4f 4b 20 7c 7c 20 28 70 54 61 62 20 26 26  E_OK || (pTab &&
33260 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 3d 3d   pTab->zQuoted==
33270 30 29 20 29 7b 0a 20 20 20 20 72 65 63 6f 76 65  0) ){.    recove
33280 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
33290 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  ;.    pTab = 0;.
332a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
332b0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
332c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
332d0 6c 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 68  led to search th
332e0 65 20 73 63 68 65 6d 61 20 72 65 63 6f 76 65 72  e schema recover
332f0 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
33300 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
33310 6c 65 20 6f 66 20 74 68 65 20 28 70 6f 73 73 69  le of the (possi
33320 62 6c 79 29 20 63 6f 72 72 75 70 74 20 64 61 74  bly) corrupt dat
33330 61 62 61 73 65 20 61 73 20 70 61 72 74 0a 2a 2a  abase as part.**
33340 20 6f 66 20 61 20 22 2e 72 65 63 6f 76 65 72 22   of a ".recover"
33350 20 63 6f 6d 6d 61 6e 64 2e 20 53 70 65 63 69 66   command. Specif
33360 69 63 61 6c 6c 79 2c 20 66 6f 72 20 61 20 74 61  ically, for a ta
33370 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ble with root pa
33380 67 65 0a 2a 2a 20 69 52 6f 6f 74 20 61 6e 64 20  ge.** iRoot and 
33390 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 63 6f  at least nCol co
333a0 6c 75 6d 6e 73 2e 20 41 64 64 69 74 69 6f 6e 61  lumns. Additiona
333b0 6c 6c 79 2c 20 69 66 20 62 49 6e 74 6b 65 79 20  lly, if bIntkey 
333c0 69 73 20 30 2c 20 74 68 65 0a 2a 2a 20 74 61 62  is 0, the.** tab
333d0 6c 65 20 6d 75 73 74 20 62 65 20 61 20 57 49 54  le must be a WIT
333e0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
333f0 2c 20 6f 72 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f  , or if non-zero
33400 2c 20 6e 6f 74 20 6f 6e 65 20 6f 66 0a 2a 2a 20  , not one of.** 
33410 74 68 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  those..**.** If 
33420 61 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  a table is found
33430 2c 20 61 20 28 52 65 63 6f 76 65 72 54 61 62 6c  , a (RecoverTabl
33440 65 2a 29 20 6f 62 6a 65 63 74 20 69 73 20 72 65  e*) object is re
33450 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 0a 2a  turned. Or, if.*
33460 2a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20  * no such table 
33470 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 62 49  is found, but bI
33480 6e 74 6b 65 79 20 69 73 20 66 61 6c 73 65 20 61  ntkey is false a
33490 6e 64 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  nd iRoot is the 
334a0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
334b0 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65   an index in the
334c0 20 72 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d   recovered schem
334d0 61 2c 20 74 68 65 6e 20 28 2a 70 62 4e 6f 6f 70  a, then (*pbNoop
334e0 29 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74  ) is.** set to t
334f0 72 75 65 20 61 6e 64 20 4e 55 4c 4c 20 72 65 74  rue and NULL ret
33500 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
33510 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
33520 61 62 6c 65 20 6f 72 0a 2a 2a 20 69 6e 64 65 78  able or.** index
33530 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
33540 65 64 20 61 6e 64 20 28 2a 70 62 4e 6f 6f 70 29  ed and (*pbNoop)
33550 20 73 65 74 20 74 6f 20 30 2c 20 69 6e 64 69 63   set to 0, indic
33560 61 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 74 68  ating that.** th
33570 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
33580 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
33590 65 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e  e orphans table.
335a0 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76  .*/.static Recov
335b0 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72  erTable *recover
335c0 46 69 6e 64 54 61 62 6c 65 28 0a 20 20 53 68 65  FindTable(.  She
335d0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335f0 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65  Shell state obje
33600 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  ct */.  int *pRc
33610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33620 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
33630 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
33640 0a 20 20 69 6e 74 20 69 52 6f 6f 74 2c 20 20 20  .  int iRoot,   
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33660 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
33670 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  of table */.  in
33680 74 20 62 49 6e 74 6b 65 79 2c 20 20 20 20 20 20  t bIntkey,      
33690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
336a0 20 54 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 74   True for an int
336b0 6b 65 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  key table */.  i
336c0 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt nCol,        
336d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
336e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
336f0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  mns in table */.
33700 20 20 69 6e 74 20 2a 70 62 4e 6f 6f 70 20 20 20    int *pbNoop   
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
33730 66 20 69 52 6f 6f 74 20 69 73 20 72 6f 6f 74 20  f iRoot is root 
33740 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
33750 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
33760 53 74 6d 74 20 3d 20 30 3b 0a 20 20 52 65 63 6f  Stmt = 0;.  Reco
33770 76 65 72 54 61 62 6c 65 20 2a 70 52 65 74 20 3d  verTable *pRet =
33780 20 30 3b 0a 20 20 69 6e 74 20 62 4e 6f 6f 70 20   0;.  int bNoop 
33790 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
337a0 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 63  r *zSql = 0;.  c
337b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
337c0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72   = 0;..  /* Sear
337d0 63 68 20 74 68 65 20 72 65 63 6f 76 65 72 65 64  ch the recovered
337e0 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6e 20 6f   schema for an o
337f0 62 6a 65 63 74 20 77 69 74 68 20 72 6f 6f 74 20  bject with root 
33800 70 61 67 65 20 69 52 6f 6f 74 2e 20 2a 2f 0a 20  page iRoot. */. 
33810 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
33820 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
33830 70 52 63 2c 20 26 70 53 74 6d 74 2c 0a 20 20 20  pRc, &pStmt,.   
33840 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c     "SELECT type,
33850 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20   name, sql FROM 
33860 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
33870 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 3d 25  WHERE rootpage=%
33880 64 22 2c 20 69 52 6f 6f 74 0a 20 20 29 3b 0a 20  d", iRoot.  );. 
33890 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51   while( *pRc==SQ
338a0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
338b0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
338c0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
338d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
338e0 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ype = (const cha
338f0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
33900 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
33910 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65  ;.    if( bIntke
33920 79 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  y==0 && sqlite3_
33930 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22  stricmp(zType, "
33940 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
33950 20 20 20 20 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20      bNoop = 1;. 
33960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33970 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
33980 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c  3_stricmp(zType,
33990 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a   "table")==0 ){.
339a0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63        zName = (c
339b0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
339c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
339d0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
339e0 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
339f0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
33a00 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32  mn_text(pStmt, 2
33a10 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
33a20 72 65 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28  recoverNewTable(
33a30 70 52 63 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c  pRc, zName, zSql
33a40 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 29  , bIntkey, nCol)
33a50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
33a60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c     }.  }..  shel
33a70 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70  lFinalize(pRc, p
33a80 53 74 6d 74 29 3b 0a 20 20 2a 70 62 4e 6f 6f 70  Stmt);.  *pbNoop
33a90 20 3d 20 62 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   = bNoop;.  retu
33aa0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
33ab0 2a 20 52 65 74 75 72 6e 20 61 20 52 65 63 6f 76  * Return a Recov
33ac0 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  erTable object r
33ad0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
33ae0 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a  orphans table..*
33af0 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72  /.static Recover
33b00 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4f 72  Table *recoverOr
33b10 70 68 61 6e 54 61 62 6c 65 28 0a 20 20 53 68 65  phanTable(.  She
33b20 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
33b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b40 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65  Shell state obje
33b50 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  ct */.  int *pRc
33b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33b70 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
33b80 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
33b90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33ba0 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 20 20  LostAndFound,   
33bb0 20 20 20 2f 2a 20 42 61 73 65 20 6e 61 6d 65 20     /* Base name 
33bc0 66 6f 72 20 6f 72 70 68 61 6e 73 20 74 61 62 6c  for orphans tabl
33bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  e */.  int nCol 
33be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33c00 20 6f 66 20 75 73 65 72 20 64 61 74 61 20 63 6f   of user data co
33c10 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 52 65  lumns */.){.  Re
33c20 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62  coverTable *pTab
33c30 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 43 6f 6c   = 0;.  if( nCol
33c40 3e 3d 30 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c  >=0 && *pRc==SQL
33c50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
33c60 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  t i;..    /* Thi
33c70 73 20 62 6c 6f 63 6b 20 64 65 74 65 72 6d 69 6e  s block determin
33c80 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  es the name of t
33c90 68 65 20 6f 72 70 68 61 6e 20 74 61 62 6c 65 2e  he orphan table.
33ca0 20 54 68 65 20 70 72 65 66 65 72 65 64 0a 20 20   The prefered.  
33cb0 20 20 2a 2a 20 6e 61 6d 65 20 69 73 20 7a 4c 6f    ** name is zLo
33cc0 73 74 41 6e 64 46 6f 75 6e 64 2e 20 42 75 74 20  stAndFound. But 
33cd0 69 66 20 74 68 61 74 20 63 6c 61 73 68 65 73 20  if that clashes 
33ce0 77 69 74 68 20 61 6e 6f 74 68 65 72 20 6e 61 6d  with another nam
33cf0 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
33d00 72 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61  recovered schema
33d10 2c 20 74 72 79 20 7a 4c 6f 73 74 41 6e 64 46 6f  , try zLostAndFo
33d20 75 6e 64 5f 30 2c 20 7a 4c 6f 73 74 41 6e 64 46  und_0, zLostAndF
33d30 6f 75 6e 64 5f 31 0a 20 20 20 20 2a 2a 20 61 6e  ound_1.    ** an
33d40 64 20 73 6f 20 6f 6e 20 75 6e 74 69 6c 20 61 20  d so on until a 
33d50 6e 6f 6e 2d 63 6c 61 73 68 69 6e 67 20 6e 61 6d  non-clashing nam
33d60 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a  e is found.  */.
33d70 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 30      int iTab = 0
33d80 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  ;.    char *zTab
33d90 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
33da0 70 52 63 2c 20 22 25 73 22 2c 20 7a 4c 6f 73 74  pRc, "%s", zLost
33db0 41 6e 64 46 6f 75 6e 64 29 3b 0a 20 20 20 20 73  AndFound);.    s
33dc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65  qlite3_stmt *pTe
33dd0 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c  st = 0;.    shel
33de0 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
33df0 3e 64 62 2c 20 70 52 63 2c 0a 20 20 20 20 20 20  >db, pRc,.      
33e00 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d    "SELECT 1 FROM
33e10 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
33e20 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f 22 2c 20   WHERE name=?", 
33e30 26 70 54 65 73 74 0a 20 20 20 20 29 3b 0a 20 20  &pTest.    );.  
33e40 20 20 69 66 28 20 70 54 65 73 74 20 29 20 73 71    if( pTest ) sq
33e50 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
33e60 70 54 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20  pTest, 1, zTab, 
33e70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
33e80 49 45 4e 54 29 3b 0a 20 20 20 20 77 68 69 6c 65  IENT);.    while
33e90 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
33ea0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
33eb0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
33ec0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 68  est) ){.      sh
33ed0 65 6c 6c 52 65 73 65 74 28 70 52 63 2c 20 70 54  ellReset(pRc, pT
33ee0 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
33ef0 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a  te3_free(zTab);.
33f00 20 20 20 20 20 20 7a 54 61 62 20 3d 20 73 68 65        zTab = she
33f10 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22  llMPrintf(pRc, "
33f20 25 73 5f 25 64 22 2c 20 7a 4c 6f 73 74 41 6e 64  %s_%d", zLostAnd
33f30 46 6f 75 6e 64 2c 20 69 54 61 62 2b 2b 29 3b 0a  Found, iTab++);.
33f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
33f50 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31  nd_text(pTest, 1
33f60 2c 20 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49  , zTab, -1, SQLI
33f70 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
33f80 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
33f90 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 54 65 73  nalize(pRc, pTes
33fa0 74 29 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20  t);..    pTab = 
33fb0 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 73  (RecoverTable*)s
33fc0 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20  hellMalloc(pRc, 
33fd0 73 69 7a 65 6f 66 28 52 65 63 6f 76 65 72 54 61  sizeof(RecoverTa
33fe0 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
33ff0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
34000 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65  b->zQuoted = she
34010 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22  llMPrintf(pRc, "
34020 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a  \"%w\"", zTab);.
34030 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
34040 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = nCol;.      p
34050 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20  Tab->iPk = -2;. 
34060 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20       if( nCol>0 
34070 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
34080 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a  >azlCol = (char*
34090 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52  *)shellMalloc(pR
340a0 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  c, sizeof(char*)
340b0 20 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20   * (nCol+1));.  
340c0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
340d0 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  azlCol ){.      
340e0 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c      pTab->azlCol
340f0 5b 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c 4d 50  [nCol] = shellMP
34100 72 69 6e 74 66 28 70 52 63 2c 20 22 22 29 3b 0a  rintf(pRc, "");.
34110 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
34120 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nCol-1; i>=0; i-
34130 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
34140 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20  pTab->azlCol[i] 
34150 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70  = shellMPrintf(p
34160 52 63 2c 20 22 25 73 2c 20 4e 55 4c 4c 22 2c 20  Rc, "%s, NULL", 
34170 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 2b 31  pTab->azlCol[i+1
34180 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
34190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
341a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52  }..      if( *pR
341b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
341c0 20 20 20 20 20 20 20 20 72 65 63 6f 76 65 72 46          recoverF
341d0 72 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  reeTable(pTab);.
341e0 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30          pTab = 0
341f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34200 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
34210 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a  f(pState->out, .
34220 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
34230 41 54 45 20 54 41 42 4c 45 20 25 73 28 72 6f 6f  ATE TABLE %s(roo
34240 74 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 22  tpgno INTEGER, "
34250 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 70 67  .            "pg
34260 6e 6f 20 49 4e 54 45 47 45 52 2c 20 6e 66 69 65  no INTEGER, nfie
34270 6c 64 20 49 4e 54 45 47 45 52 2c 20 69 64 20 49  ld INTEGER, id I
34280 4e 54 45 47 45 52 22 2c 20 70 54 61 62 2d 3e 7a  NTEGER", pTab->z
34290 51 75 6f 74 65 64 0a 20 20 20 20 20 20 20 20 29  Quoted.        )
342a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
342b0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
342c0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
342d0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
342e0 74 2c 20 22 2c 20 63 25 64 22 2c 20 69 29 3b 0a  t, ", c%d", i);.
342f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34300 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
34310 61 74 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c 6e 22  ate->out, ");\n"
34320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34330 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
34340 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72  e(zTab);.  }.  r
34350 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
34360 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34370 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
34380 72 65 63 6f 76 65 72 20 64 61 74 61 20 66 72 6f  recover data fro
34390 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
343a0 41 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f 20 63  A script.** to c
343b0 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 64  onstruct a new d
343c0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
343d0 6e 67 20 61 6c 6c 20 72 65 63 6f 76 65 72 65 64  ng all recovered
343e0 20 64 61 74 61 20 69 73 20 6f 75 74 70 75 74 0a   data is output.
343f0 2a 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70 53 74  ** on stream pSt
34400 61 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61  ate->out..*/.sta
34410 74 69 63 20 69 6e 74 20 72 65 63 6f 76 65 72 44  tic int recoverD
34420 61 74 61 62 61 73 65 43 6d 64 28 53 68 65 6c 6c  atabaseCmd(Shell
34430 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 69  State *pState, i
34440 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
34450 61 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  azArg){.  int rc
34460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34470 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c  sqlite3_stmt *pL
34480 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oop = 0;        
34490 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
344a0 61 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  all root pages *
344b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
344c0 20 2a 70 50 61 67 65 73 20 3d 20 30 3b 20 20 20   *pPages = 0;   
344d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
344e0 75 67 68 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  ugh all pages in
344f0 20 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20 73 71   a group */.  sq
34500 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 65 6c  lite3_stmt *pCel
34510 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ls = 0;       /*
34520 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
34530 6c 20 63 65 6c 6c 73 20 69 6e 20 61 20 70 61 67  l cells in a pag
34540 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
34550 72 20 2a 7a 52 65 63 6f 76 65 72 79 44 62 20 3d  r *zRecoveryDb =
34560 20 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f   "";   /* Name o
34570 66 20 22 72 65 63 6f 76 65 72 79 22 20 64 61 74  f "recovery" dat
34580 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
34590 20 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46   char *zLostAndF
345a0 6f 75 6e 64 20 3d 20 22 6c 6f 73 74 5f 61 6e 64  ound = "lost_and
345b0 5f 66 6f 75 6e 64 22 3b 0a 20 20 69 6e 74 20 69  _found";.  int i
345c0 3b 0a 20 20 69 6e 74 20 6e 4f 72 70 68 61 6e 20  ;.  int nOrphan 
345d0 3d 20 2d 31 3b 0a 20 20 52 65 63 6f 76 65 72 54  = -1;.  RecoverT
345e0 61 62 6c 65 20 2a 70 4f 72 70 68 61 6e 20 3d 20  able *pOrphan = 
345f0 30 3b 0a 0a 20 20 69 6e 74 20 62 46 72 65 65 6c  0;..  int bFreel
34600 69 73 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ist = 1;        
34610 20 20 20 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d        /* 0 if --
34620 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74  freelist-corrupt
34630 20 69 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f   is specified */
34640 0a 20 20 69 6e 74 20 62 52 6f 77 69 64 73 20 3d  .  int bRowids =
34650 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
34660 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d 6e 6f 2d     /* 0 if --no-
34670 72 6f 77 69 64 73 20 2a 2f 0a 20 20 66 6f 72 28  rowids */.  for(
34680 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
34690 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
346a0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69   azArg[i];.    i
346b0 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b  nt n;.    if( z[
346c0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
346d0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
346e0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
346f0 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 37 20 26  .    if( n<=17 &
34700 26 20 6d 65 6d 63 6d 70 28 22 2d 66 72 65 65 6c  & memcmp("-freel
34710 69 73 74 2d 63 6f 72 72 75 70 74 22 2c 20 7a 2c  ist-corrupt", z,
34720 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
34730 62 46 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20  bFreelist = 0;. 
34740 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28     }else.    if(
34750 20 6e 3c 3d 31 32 20 26 26 20 6d 65 6d 63 6d 70   n<=12 && memcmp
34760 28 22 2d 72 65 63 6f 76 65 72 79 2d 64 62 22 2c  ("-recovery-db",
34770 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28   z, n)==0 && i<(
34780 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
34790 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 52 65 63   i++;.      zRec
347a0 6f 76 65 72 79 44 62 20 3d 20 61 7a 41 72 67 5b  overyDb = azArg[
347b0 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20  i];.    }else.  
347c0 20 20 69 66 28 20 6e 3c 3d 31 35 20 26 26 20 6d    if( n<=15 && m
347d0 65 6d 63 6d 70 28 22 2d 6c 6f 73 74 2d 61 6e 64  emcmp("-lost-and
347e0 2d 66 6f 75 6e 64 22 2c 20 7a 2c 20 6e 29 3d 3d  -found", z, n)==
347f0 30 20 26 26 20 69 3c 28 6e 41 72 67 2d 31 29 20  0 && i<(nArg-1) 
34800 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
34810 20 20 20 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e      zLostAndFoun
34820 64 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  d = azArg[i];.  
34830 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20    }else.    if( 
34840 6e 3c 3d 31 30 20 26 26 20 6d 65 6d 63 6d 70 28  n<=10 && memcmp(
34850 22 2d 6e 6f 2d 72 6f 77 69 64 73 22 2c 20 7a 2c  "-no-rowids", z,
34860 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
34870 62 52 6f 77 69 64 73 20 3d 20 30 3b 0a 20 20 20  bRowids = 0;.   
34880 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
34890 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
348a0 74 64 65 72 72 2c 20 22 75 6e 65 78 70 65 63 74  tderr, "unexpect
348b0 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  ed option: %s\n"
348c0 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 20 0a 20 20  , azArg[i]); .  
348d0 20 20 20 20 73 68 6f 77 48 65 6c 70 28 70 53 74      showHelp(pSt
348e0 61 74 65 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  ate->out, azArg[
348f0 30 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0]);.      retur
34900 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
34910 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74    shellExecPrint
34920 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  f(pState->db, &r
34930 63 2c 0a 20 20 20 20 2f 2a 20 41 74 74 61 63 68  c,.    /* Attach
34940 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
34950 74 61 62 61 73 65 20 6e 61 6d 65 64 20 27 72 65  tabase named 're
34960 63 6f 76 65 72 79 27 2e 20 43 72 65 61 74 65 20  covery'. Create 
34970 61 6e 20 69 6e 64 65 78 65 64 20 0a 20 20 20 20  an indexed .    
34980 2a 2a 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  ** cache of the 
34990 73 71 6c 69 74 65 5f 64 62 70 74 72 20 76 69 72  sqlite_dbptr vir
349a0 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tual table. */. 
349b0 20 20 20 22 50 52 41 47 4d 41 20 77 72 69 74 61     "PRAGMA writa
349c0 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 3b  ble_schema = on;
349d0 22 0a 20 20 20 20 22 41 54 54 41 43 48 20 25 51  ".    "ATTACH %Q
349e0 20 41 53 20 72 65 63 6f 76 65 72 79 3b 22 0a 20   AS recovery;". 
349f0 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49     "DROP TABLE I
34a00 46 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72  F EXISTS recover
34a10 79 2e 64 62 70 74 72 3b 22 0a 20 20 20 20 22 44  y.dbptr;".    "D
34a20 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
34a30 53 54 53 20 72 65 63 6f 76 65 72 79 2e 66 72 65  STS recovery.fre
34a40 65 6c 69 73 74 3b 22 0a 20 20 20 20 22 44 52 4f  elist;".    "DRO
34a50 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
34a60 53 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 3b 22  S recovery.map;"
34a70 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
34a80 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76   IF EXISTS recov
34a90 65 72 79 2e 73 63 68 65 6d 61 3b 22 0a 20 20 20  ery.schema;".   
34aa0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72   "CREATE TABLE r
34ab0 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74  ecovery.freelist
34ac0 28 70 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  (pgno INTEGER PR
34ad0 49 4d 41 52 59 20 4b 45 59 29 3b 22 2c 20 7a 52  IMARY KEY);", zR
34ae0 65 63 6f 76 65 72 79 44 62 0a 20 20 29 3b 0a 0a  ecoveryDb.  );..
34af0 20 20 69 66 28 20 62 46 72 65 65 6c 69 73 74 20    if( bFreelist 
34b00 29 7b 0a 20 20 20 20 73 68 65 6c 6c 45 78 65 63  ){.    shellExec
34b10 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
34b20 2c 0a 20 20 20 20 20 20 22 57 49 54 48 20 74 72  ,.      "WITH tr
34b30 75 6e 6b 28 70 67 6e 6f 29 20 41 53 20 28 22 0a  unk(pgno) AS (".
34b40 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
34b50 73 68 65 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20  shell_int32(".  
34b60 20 20 20 20 22 20 20 20 20 20 20 28 53 45 4c 45      "      (SELE
34b70 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c  CT data FROM sql
34b80 69 74 65 5f 64 62 70 61 67 65 20 57 48 45 52 45  ite_dbpage WHERE
34b90 20 70 67 6e 6f 3d 31 29 2c 20 38 29 20 41 53 20   pgno=1), 8) AS 
34ba0 78 20 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  x ".      "     
34bb0 20 57 48 45 52 45 20 78 3e 30 22 0a 20 20 20 20   WHERE x>0".    
34bc0 20 20 22 20 20 20 20 55 4e 49 4f 4e 22 0a 20 20    "    UNION".  
34bd0 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 68      "  SELECT sh
34be0 65 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20  ell_int32(".    
34bf0 20 20 22 20 20 20 20 20 20 28 53 45 4c 45 43 54    "      (SELECT
34c00 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
34c10 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70  e_dbpage WHERE p
34c20 67 6e 6f 3d 74 72 75 6e 6b 2e 70 67 6e 6f 29 2c  gno=trunk.pgno),
34c30 20 30 29 20 41 53 20 78 20 22 0a 20 20 20 20 20   0) AS x ".     
34c40 20 22 20 20 20 20 20 20 46 52 4f 4d 20 74 72 75   "      FROM tru
34c50 6e 6b 20 57 48 45 52 45 20 78 3e 30 22 0a 20 20  nk WHERE x>0".  
34c60 20 20 20 20 22 29 2c 22 0a 20 20 20 20 20 20 22      "),".      "
34c70 66 72 65 65 6c 69 73 74 28 64 61 74 61 2c 20 6e  freelist(data, n
34c80 2c 20 66 72 65 65 70 67 6e 6f 29 20 41 53 20 28  , freepgno) AS (
34c90 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
34ca0 54 20 64 61 74 61 2c 20 6d 69 6e 28 31 36 33 38  T data, min(1638
34cb0 34 2c 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64  4, shell_int32(d
34cc0 61 74 61 2c 20 31 29 2d 31 29 2c 20 74 2e 70 67  ata, 1)-1), t.pg
34cd0 6e 6f 20 22 0a 20 20 20 20 20 20 22 20 20 20 20  no ".      "    
34ce0 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20 74 2c 20    FROM trunk t, 
34cf0 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 73 20  sqlite_dbpage s 
34d00 57 48 45 52 45 20 73 2e 70 67 6e 6f 3d 74 2e 70  WHERE s.pgno=t.p
34d10 67 6e 6f 22 0a 20 20 20 20 20 20 22 20 20 20 20  gno".      "    
34d20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
34d30 20 22 20 20 53 45 4c 45 43 54 20 64 61 74 61 2c   "  SELECT data,
34d40 20 6e 2d 31 2c 20 73 68 65 6c 6c 5f 69 6e 74 33   n-1, shell_int3
34d50 32 28 64 61 74 61 2c 20 32 2b 6e 29 20 22 0a 20  2(data, 2+n) ". 
34d60 20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f 4d       "      FROM
34d70 20 66 72 65 65 6c 69 73 74 20 57 48 45 52 45 20   freelist WHERE 
34d80 6e 3e 3d 30 22 0a 20 20 20 20 20 20 22 29 22 0a  n>=0".      ")".
34d90 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
34da0 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 66 72 65  NTO recovery.fre
34db0 65 6c 69 73 74 20 53 45 4c 45 43 54 20 66 72 65  elist SELECT fre
34dc0 65 70 67 6e 6f 20 46 52 4f 4d 20 66 72 65 65 6c  epgno FROM freel
34dd0 69 73 74 3b 22 0a 20 20 20 20 29 3b 0a 20 20 7d  ist;".    );.  }
34de0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
34df0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
34e00 20 64 61 74 61 62 61 73 65 2c 20 61 64 64 20 61   database, add a
34e10 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ll pointer-map p
34e20 61 67 65 73 20 74 6f 0a 20 20 2a 2a 20 74 68 65  ages to.  ** the
34e30 20 66 72 65 65 6c 69 73 74 20 74 61 62 6c 65 2e   freelist table.
34e40 20 44 6f 20 74 68 69 73 20 72 65 67 61 72 64 6c   Do this regardl
34e50 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
34e60 72 20 6e 6f 74 20 0a 20 20 2a 2a 20 2d 2d 66 72  r not .  ** --fr
34e70 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 20 77  eelist-corrupt w
34e80 61 73 20 73 70 65 63 69 66 69 65 64 2e 20 20 2a  as specified.  *
34e90 2f 0a 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53  /.  shellExec(pS
34ea0 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a  tate->db, &rc, .
34eb0 20 20 20 20 22 57 49 54 48 20 70 74 72 6d 61 70      "WITH ptrmap
34ec0 28 70 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20  (pgno) AS (".   
34ed0 20 22 20 20 53 45 4c 45 43 54 20 32 20 57 48 45   "  SELECT 2 WHE
34ee0 52 45 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 22  RE shell_int32("
34ef0 0a 20 20 20 20 22 20 20 20 20 28 53 45 4c 45 43  .    "    (SELEC
34f00 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69  T data FROM sqli
34f10 74 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20  te_dbpage WHERE 
34f20 70 67 6e 6f 3d 31 29 2c 20 31 33 22 0a 20 20 20  pgno=1), 13".   
34f30 20 22 20 20 29 22 0a 20 20 20 20 22 20 20 20 20   "  )".    "    
34f40 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20  UNION ALL ".    
34f50 22 20 20 53 45 4c 45 43 54 20 70 67 6e 6f 2b 31  "  SELECT pgno+1
34f60 2b 28 53 45 4c 45 43 54 20 70 61 67 65 5f 73 69  +(SELECT page_si
34f70 7a 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70  ze FROM pragma_p
34f80 61 67 65 5f 73 69 7a 65 29 2f 35 20 41 53 20 70  age_size)/5 AS p
34f90 70 20 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  p ".    "  FROM 
34fa0 70 74 72 6d 61 70 20 57 48 45 52 45 20 70 70 3c  ptrmap WHERE pp<
34fb0 3d 28 53 45 4c 45 43 54 20 70 61 67 65 5f 63 6f  =(SELECT page_co
34fc0 75 6e 74 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  unt FROM pragma_
34fd0 70 61 67 65 5f 63 6f 75 6e 74 29 22 0a 20 20 20  page_count)".   
34fe0 20 22 29 22 0a 20 20 20 20 22 52 45 50 4c 41 43   ")".    "REPLAC
34ff0 45 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e  E INTO recovery.
35000 66 72 65 65 6c 69 73 74 20 53 45 4c 45 43 54 20  freelist SELECT 
35010 70 67 6e 6f 20 46 52 4f 4d 20 70 74 72 6d 61 70  pgno FROM ptrmap
35020 22 0a 20 20 29 3b 0a 0a 20 20 73 68 65 6c 6c 45  ".  );..  shellE
35030 78 65 63 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  xec(pState->db, 
35040 26 72 63 2c 20 0a 20 20 20 20 22 43 52 45 41 54  &rc, .    "CREAT
35050 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
35060 2e 64 62 70 74 72 28 22 0a 20 20 20 20 22 20 20  .dbptr(".    "  
35070 20 20 20 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c      pgno, child,
35080 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 68 69   PRIMARY KEY(chi
35090 6c 64 2c 20 70 67 6e 6f 29 22 0a 20 20 20 20 22  ld, pgno)".    "
350a0 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
350b0 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  ".    "INSERT OR
350c0 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63   IGNORE INTO rec
350d0 6f 76 65 72 79 2e 64 62 70 74 72 28 70 67 6e 6f  overy.dbptr(pgno
350e0 2c 20 63 68 69 6c 64 29 20 22 0a 20 20 20 20 22  , child) ".    "
350f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
35100 4d 20 73 71 6c 69 74 65 5f 64 62 70 74 72 22 0a  M sqlite_dbptr".
35110 20 20 20 20 22 20 20 20 20 20 20 57 48 45 52 45      "      WHERE
35120 20 70 67 6e 6f 20 4e 4f 54 20 49 4e 20 66 72 65   pgno NOT IN fre
35130 65 6c 69 73 74 20 41 4e 44 20 63 68 69 6c 64 20  elist AND child 
35140 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69 73 74 3b  NOT IN freelist;
35150 22 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  "..    /* Delete
35160 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 74 6f 20   any pointer to 
35170 70 61 67 65 20 31 2e 20 54 68 69 73 20 65 6e 73  page 1. This ens
35180 75 72 65 73 20 74 68 61 74 20 70 61 67 65 20 31  ures that page 1
35190 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 20   is considered. 
351a0 20 20 20 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67     ** a root pag
351b0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
351c0 20 68 6f 77 20 63 6f 72 72 75 70 74 20 74 68 65   how corrupt the
351d0 20 64 62 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22   db is. */.    "
351e0 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 63 6f  DELETE FROM reco
351f0 76 65 72 79 2e 64 62 70 74 72 20 57 48 45 52 45  very.dbptr WHERE
35200 20 63 68 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20   child = 1;"..  
35210 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
35220 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 79 20  pointers to any 
35230 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
35240 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f  more than one po
35250 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
35260 74 68 65 6d 2e 20 53 75 63 68 20 70 61 67 65 73  them. Such pages
35270 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
35280 20 61 73 20 72 6f 6f 74 20 70 61 67 65 73 20 77   as root pages w
35290 68 65 6e 20 72 65 63 6f 76 65 72 69 6e 67 0a 20  hen recovering. 
352a0 20 20 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a     ** data.  */.
352b0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
352c0 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20   recovery.dbptr 
352d0 57 48 45 52 45 20 63 68 69 6c 64 20 49 4e 20 28  WHERE child IN (
352e0 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
352f0 63 68 69 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76  child FROM recov
35300 65 72 79 2e 64 62 70 74 72 20 47 52 4f 55 50 20  ery.dbptr GROUP 
35310 42 59 20 63 68 69 6c 64 20 48 41 56 49 4e 47 20  BY child HAVING 
35320 63 6f 75 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20  count(*)>1".    
35330 22 29 3b 22 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ");"..    /* Cre
35340 61 74 65 20 74 68 65 20 22 6d 61 70 22 20 74 61  ate the "map" ta
35350 62 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 28 65  ble that will (e
35360 76 65 6e 74 75 61 6c 6c 79 29 20 63 6f 6e 74 61  ventually) conta
35370 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  in instructions.
35380 20 20 20 20 2a 2a 20 66 6f 72 20 64 65 61 6c 69      ** for deali
35390 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
353a0 65 20 69 6e 20 74 68 65 20 64 62 20 74 68 61 74  e in the db that
353b0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
353c0 20 6d 6f 72 65 20 0a 20 20 20 20 2a 2a 20 72 65   more .    ** re
353d0 63 6f 72 64 73 2e 20 2a 2f 0a 20 20 20 20 22 43  cords. */.    "C
353e0 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f  REATE TABLE reco
353f0 76 65 72 79 2e 6d 61 70 28 22 0a 20 20 20 20 20  very.map(".     
35400 20 22 70 67 6e 6f 20 49 4e 54 45 47 45 52 20 50   "pgno INTEGER P
35410 52 49 4d 41 52 59 20 4b 45 59 2c 20 6d 61 78 6c  RIMARY KEY, maxl
35420 65 6e 20 49 4e 54 2c 20 69 6e 74 6b 65 79 2c 20  en INT, intkey, 
35430 72 6f 6f 74 20 49 4e 54 22 0a 20 20 20 20 22 29  root INT".    ")
35440 3b 22 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  ;"..    /* Popul
35450 61 74 65 20 74 61 62 6c 65 20 5b 6d 61 70 5d 2e  ate table [map].
35460 20 49 66 20 74 68 65 72 65 20 61 72 65 20 63 69   If there are ci
35470 72 63 75 6c 61 72 20 6c 6f 6f 70 73 20 6f 66 20  rcular loops of 
35480 70 61 67 65 73 20 69 6e 20 74 68 65 0a 20 20 20  pages in the.   
35490 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
354a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 64 64 73  e following adds
354b0 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 73 75   all pages in su
354c0 63 68 20 61 20 6c 6f 6f 70 20 74 6f 20 74 68 65  ch a loop to the
354d0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 61 73 20 69   map.    ** as i
354e0 6e 64 69 76 69 64 75 61 6c 20 72 6f 6f 74 20 70  ndividual root p
354f0 61 67 65 73 2e 20 54 68 69 73 20 63 6f 75 6c 64  ages. This could
35500 20 62 65 20 68 61 6e 64 6c 65 64 20 62 65 74 74   be handled bett
35510 65 72 2e 20 20 2a 2f 0a 20 20 20 20 22 57 49 54  er.  */.    "WIT
35520 48 20 70 61 67 65 73 28 69 2c 20 6d 61 78 6c 65  H pages(i, maxle
35530 6e 29 20 41 53 20 28 22 0a 20 20 20 20 22 20 20  n) AS (".    "  
35540 53 45 4c 45 43 54 20 70 61 67 65 5f 63 6f 75 6e  SELECT page_coun
35550 74 2c 20 28 22 0a 20 20 20 20 22 20 20 20 20 53  t, (".    "    S
35560 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64 2b  ELECT max(field+
35570 31 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  1) FROM sqlite_d
35580 62 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f  bdata WHERE pgno
35590 3d 70 61 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20  =page_count".   
355a0 20 22 20 20 29 20 46 52 4f 4d 20 70 72 61 67 6d   "  ) FROM pragm
355b0 61 5f 70 61 67 65 5f 63 6f 75 6e 74 20 57 48 45  a_page_count WHE
355c0 52 45 20 70 61 67 65 5f 63 6f 75 6e 74 3e 30 22  RE page_count>0"
355d0 0a 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20  .    "    UNION 
355e0 41 4c 4c 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ALL".    "  SELE
355f0 43 54 20 69 2d 31 2c 20 28 22 0a 20 20 20 20 22  CT i-1, (".    "
35600 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 66      SELECT max(f
35610 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c  ield+1) FROM sql
35620 69 74 65 5f 64 62 64 61 74 61 20 57 48 45 52 45  ite_dbdata WHERE
35630 20 70 67 6e 6f 3d 69 2d 31 22 0a 20 20 20 20 22   pgno=i-1".    "
35640 20 20 29 20 46 52 4f 4d 20 70 61 67 65 73 20 57    ) FROM pages W
35650 48 45 52 45 20 69 3e 3d 32 22 0a 20 20 20 20 22  HERE i>=2".    "
35660 29 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  )".    "INSERT I
35670 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 6d 61 70  NTO recovery.map
35680 28 70 67 6e 6f 2c 20 6d 61 78 6c 65 6e 2c 20 69  (pgno, maxlen, i
35690 6e 74 6b 65 79 2c 20 72 6f 6f 74 29 20 22 0a 20  ntkey, root) ". 
356a0 20 20 20 22 20 20 53 45 4c 45 43 54 20 69 2c 20     "  SELECT i, 
356b0 6d 61 78 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 28 22  maxlen, NULL, ("
356c0 0a 20 20 20 20 22 20 20 20 20 57 49 54 48 20 70  .    "    WITH p
356d0 28 6f 72 69 67 2c 20 70 67 6e 6f 2c 20 70 61 72  (orig, pgno, par
356e0 65 6e 74 29 20 41 53 20 28 22 0a 20 20 20 20 22  ent) AS (".    "
356f0 20 20 20 20 20 20 53 45 4c 45 43 54 20 30 2c 20        SELECT 0, 
35700 69 2c 20 28 53 45 4c 45 43 54 20 70 67 6e 6f 20  i, (SELECT pgno 
35710 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62  FROM recovery.db
35720 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64 3d  ptr WHERE child=
35730 69 29 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  i)".    "       
35740 20 55 4e 49 4f 4e 20 22 0a 20 20 20 20 22 20 20   UNION ".    "  
35750 20 20 20 20 53 45 4c 45 43 54 20 69 2c 20 70 2e      SELECT i, p.
35760 70 61 72 65 6e 74 2c 20 22 0a 20 20 20 20 22 20  parent, ".    " 
35770 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 70         (SELECT p
35780 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  gno FROM recover
35790 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68  y.dbptr WHERE ch
357a0 69 6c 64 3d 70 2e 70 61 72 65 6e 74 29 20 46 52  ild=p.parent) FR
357b0 4f 4d 20 70 22 0a 20 20 20 20 22 20 20 20 20 29  OM p".    "    )
357c0 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
357d0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 70 20 57 48  T pgno FROM p WH
357e0 45 52 45 20 28 70 61 72 65 6e 74 20 49 53 20 4e  ERE (parent IS N
357f0 55 4c 4c 20 4f 52 20 70 67 6e 6f 20 3d 20 6f 72  ULL OR pgno = or
35800 69 67 29 22 0a 20 20 20 20 22 29 20 22 0a 20 20  ig)".    ") ".  
35810 20 20 22 46 52 4f 4d 20 70 61 67 65 73 20 57 48    "FROM pages WH
35820 45 52 45 20 6d 61 78 6c 65 6e 20 49 53 20 4e 4f  ERE maxlen IS NO
35830 54 20 4e 55 4c 4c 20 41 4e 44 20 69 20 4e 4f 54  T NULL AND i NOT
35840 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 20   IN freelist;". 
35850 20 20 20 22 55 50 44 41 54 45 20 72 65 63 6f 76     "UPDATE recov
35860 65 72 79 2e 6d 61 70 20 41 53 20 6f 20 53 45 54  ery.map AS o SET
35870 20 69 6e 74 6b 65 79 20 3d 20 28 22 0a 20 20 20   intkey = (".   
35880 20 22 20 20 53 45 4c 45 43 54 20 73 75 62 73 74   "  SELECT subst
35890 72 28 64 61 74 61 2c 20 31 2c 20 31 29 3d 3d 58  r(data, 1, 1)==X
358a0 27 30 44 27 20 46 52 4f 4d 20 73 71 6c 69 74 65  '0D' FROM sqlite
358b0 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67  _dbpage WHERE pg
358c0 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a 20 20 20 20 22  no=o.pgno".    "
358d0 29 3b 22 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  );"..    /* Extr
358e0 61 63 74 20 64 61 74 61 20 66 72 6f 6d 20 70 61  act data from pa
358f0 67 65 20 31 20 61 6e 64 20 61 6e 79 20 6c 69 6e  ge 1 and any lin
35900 6b 65 64 20 70 61 67 65 73 20 69 6e 74 6f 20 74  ked pages into t
35910 61 62 6c 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f  able.    ** reco
35920 76 65 72 79 2e 73 63 68 65 6d 61 2e 20 57 69 74  very.schema. Wit
35930 68 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d  h the same schem
35940 61 20 61 73 20 61 6e 20 73 71 6c 69 74 65 5f 6d  a as an sqlite_m
35950 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 2a 2f  aster table.  */
35960 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
35970 4c 45 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  LE recovery.sche
35980 6d 61 28 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74  ma(type, name, t
35990 62 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67  bl_name, rootpag
359a0 65 2c 20 73 71 6c 29 3b 22 0a 20 20 20 20 22 49  e, sql);".    "I
359b0 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63 6f 76  NSERT INTO recov
359c0 65 72 79 2e 73 63 68 65 6d 61 20 53 45 4c 45 43  ery.schema SELEC
359d0 54 20 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  T ".    "  max(C
359e0 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 30  ASE WHEN field=0
359f0 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
35a00 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20   NULL END),".   
35a10 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
35a20 4e 20 66 69 65 6c 64 3d 31 20 54 48 45 4e 20 76  N field=1 THEN v
35a30 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
35a40 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78  ND),".    "  max
35a50 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64  (CASE WHEN field
35a60 3d 32 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c  =2 THEN value EL
35a70 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20  SE NULL END),". 
35a80 20 20 20 22 20 20 6d 61 78 28 43 41 53 45 20 57     "  max(CASE W
35a90 48 45 4e 20 66 69 65 6c 64 3d 33 20 54 48 45 4e  HEN field=3 THEN
35aa0 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c   value ELSE NULL
35ab0 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d   END),".    "  m
35ac0 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69 65  ax(CASE WHEN fie
35ad0 6c 64 3d 34 20 54 48 45 4e 20 76 61 6c 75 65 20  ld=4 THEN value 
35ae0 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 22 0a  ELSE NULL END)".
35af0 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
35b00 5f 64 62 64 61 74 61 20 57 48 45 52 45 20 70 67  _dbdata WHERE pg
35b10 6e 6f 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20  no IN (".    "  
35b20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
35b30 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48   recovery.map WH
35b40 45 52 45 20 72 6f 6f 74 3d 31 22 0a 20 20 20 20  ERE root=1".    
35b50 22 29 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42  ")".    "GROUP B
35b60 59 20 70 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20  Y pgno, cell;". 
35b70 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58     "CREATE INDEX
35b80 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
35b90 5f 72 6f 6f 74 70 61 67 65 20 4f 4e 20 73 63 68  _rootpage ON sch
35ba0 65 6d 61 28 72 6f 6f 74 70 61 67 65 29 3b 22 0a  ema(rootpage);".
35bb0 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20    );..  /* Open 
35bc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
35bd0 68 65 6e 20 70 72 69 6e 74 20 6f 75 74 20 61 6c  hen print out al
35be0 6c 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 2c 20 6e  l non-virtual, n
35bf0 6f 6e 2d 22 73 71 6c 69 74 65 5f 25 22 20 0a 20  on-"sqlite_%" . 
35c00 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
35c10 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
35c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
35c30 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 63 68  the existing sch
35c40 65 6d 61 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ema.  */.  if( r
35c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35c60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
35c70 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
35c80 20 2f 2a 20 22 2e 72 65 63 6f 76 65 72 22 20 6d   /* ".recover" m
35c90 69 67 68 74 20 6f 75 74 70 75 74 20 63 6f 6e 74  ight output cont
35ca0 65 6e 74 20 69 6e 20 61 6e 20 6f 72 64 65 72 20  ent in an order 
35cb0 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d  which causes imm
35cc0 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6f  ediate.    ** fo
35cd0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
35ce0 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c  aints to be viol
35cf0 61 74 65 64 2e 20 53 6f 20 64 69 73 61 62 6c 65  ated. So disable
35d00 20 66 6f 72 65 69 67 6e 2d 6b 65 79 0a 20 20 20   foreign-key.   
35d10 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 65   ** constraint e
35d20 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72  nforcement to pr
35d30 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 20 77  event problems w
35d40 68 65 6e 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  hen running the 
35d50 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 63  output.    ** sc
35d60 72 69 70 74 2e 20 2a 2f 0a 20 20 20 20 72 61 77  ript. */.    raw
35d70 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
35d80 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  out, "PRAGMA for
35d90 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e  eign_keys=OFF;\n
35da0 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
35db0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
35dc0 22 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20 20 20  "BEGIN;\n");.   
35dd0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
35de0 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41  te->out, "PRAGMA
35df0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
35e00 20 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20   = on;\n");.    
35e10 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74  shellPrepare(pSt
35e20 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20  ate->db, &rc,.  
35e30 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
35e40 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  l FROM recovery.
35e50 73 63 68 65 6d 61 20 22 0a 20 20 20 20 20 20 20  schema ".       
35e60 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 74 61   "WHERE type='ta
35e70 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c 49 4b  ble' AND sql LIK
35e80 45 20 27 63 72 65 61 74 65 20 74 61 62 6c 65 25  E 'create table%
35e90 27 22 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29  '", &pStmt.    )
35ea0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
35eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
35ec0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
35ed0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
35ee0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
35ef0 72 20 2a 7a 43 72 65 61 74 65 54 61 62 6c 65 20  r *zCreateTable 
35f00 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
35f10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
35f20 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
35f30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
35f40 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43 52 45  State->out, "CRE
35f50 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
35f60 20 45 58 49 53 54 53 20 25 73 3b 5c 6e 22 2c 20   EXISTS %s;\n", 
35f70 0a 20 20 20 20 20 20 20 20 20 20 26 7a 43 72 65  .          &zCre
35f80 61 74 65 54 61 62 6c 65 5b 31 32 5d 0a 20 20 20  ateTable[12].   
35f90 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
35fa0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
35fb0 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  c, pStmt);.  }..
35fc0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
35fd0 69 66 20 61 6e 20 6f 72 70 68 61 6e 20 74 61 62  if an orphan tab
35fe0 6c 65 20 77 69 6c 6c 20 62 65 20 72 65 71 75 69  le will be requi
35ff0 72 65 64 2e 20 41 6e 64 20 69 66 20 73 6f 2c 20  red. And if so, 
36000 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 73  how many.  ** us
36010 65 72 20 63 6f 6c 75 6d 6e 73 20 69 74 20 73 68  er columns it sh
36020 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 2a 2f 0a  ould contain */.
36030 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
36040 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20  State->db, &rc, 
36050 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  .      "SELECT c
36060 6f 61 6c 65 73 63 65 28 6d 61 78 28 6d 61 78 6c  oalesce(max(maxl
36070 65 6e 29 2c 20 2d 32 29 20 46 52 4f 4d 20 72 65  en), -2) FROM re
36080 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45  covery.map WHERE
36090 20 72 6f 6f 74 3e 31 22 0a 20 20 20 20 20 20 2c   root>1".      ,
360a0 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20 69   &pLoop.  );.  i
360b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
360c0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
360d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f  sqlite3_step(pLo
360e0 6f 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72 70 68  op) ){.    nOrph
360f0 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  an = sqlite3_col
36100 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30  umn_int(pLoop, 0
36110 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69  );.  }.  shellFi
36120 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f  nalize(&rc, pLoo
36130 70 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 30 3b  p);.  pLoop = 0;
36140 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
36150 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
36160 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
36170 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65  pgno FROM recove
36180 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72 6f 6f  ry.map WHERE roo
36190 74 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a 20 20  t=?", &pPages.  
361a0 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  );..  shellPrepa
361b0 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
361c0 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  rc,.      "SELEC
361d0 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20 67 72  T max(field), gr
361e0 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c 6c  oup_concat(shell
361f0 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71 75 6f  _escape_crnl(quo
36200 74 65 22 0a 20 20 20 20 20 20 22 28 63 61 73 65  te".      "(case
36210 20 77 68 65 6e 20 28 3f 20 41 4e 44 20 66 69 65   when (? AND fie
36220 6c 64 3c 30 29 20 74 68 65 6e 20 4e 55 4c 4c 20  ld<0) then NULL 
36230 65 6c 73 65 20 76 61 6c 75 65 20 65 6e 64 29 22  else value end)"
36240 0a 20 20 20 20 20 20 22 29 2c 20 27 2c 20 27 29  .      "), ', ')
36250 22 0a 20 20 20 20 20 20 22 2c 20 6d 69 6e 28 66  ".      ", min(f
36260 69 65 6c 64 29 20 22 0a 20 20 20 20 20 20 22 46  ield) ".      "F
36270 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74  ROM sqlite_dbdat
36280 61 20 57 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f  a WHERE pgno = ?
36290 20 41 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f 22   AND field != ?"
362a0 0a 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59  .      "GROUP BY
362b0 20 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a   cell", &pCells.
362c0 20 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20    );..  /* Loop 
362d0 74 68 72 6f 75 67 68 20 65 61 63 68 20 72 6f 6f  through each roo
362e0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65  t page. */.  she
362f0 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65  llPrepare(pState
36300 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20  ->db, &rc, .    
36310 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20    "SELECT root, 
36320 69 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c  intkey, max(maxl
36330 65 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  en) FROM recover
36340 79 2e 6d 61 70 22 20 0a 20 20 20 20 20 20 22 20  y.map" .      " 
36350 57 48 45 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f  WHERE root>1 GRO
36360 55 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b  UP BY root, intk
36370 65 79 20 4f 52 44 45 52 20 42 59 20 72 6f 6f 74  ey ORDER BY root
36380 3d 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c  =(".      "  SEL
36390 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
363a0 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
363b0 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71  a WHERE name='sq
363c0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
363d0 20 20 20 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f        ")", &pLoo
363e0 70 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  p.  );.  while( 
363f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36400 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
36410 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29  ite3_step(pLoop)
36420 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f   ){.    int iRoo
36430 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
36440 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29  mn_int(pLoop, 0)
36450 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 74 6b 65  ;.    int bIntke
36460 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  y = sqlite3_colu
36470 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29  mn_int(pLoop, 1)
36480 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
36490 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
364a0 69 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20  int(pLoop, 2);. 
364b0 20 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30     int bNoop = 0
364c0 3b 0a 20 20 20 20 52 65 63 6f 76 65 72 54 61 62  ;.    RecoverTab
364d0 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 61  le *pTab;..    a
364e0 73 73 65 72 74 28 20 62 49 6e 74 6b 65 79 3d 3d  ssert( bIntkey==
364f0 30 20 7c 7c 20 62 49 6e 74 6b 65 79 3d 3d 31 20  0 || bIntkey==1 
36500 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 72 65  );.    pTab = re
36510 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28 70  coverFindTable(p
36520 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f 6f  State, &rc, iRoo
36530 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c  t, bIntkey, nCol
36540 2c 20 26 62 4e 6f 6f 70 29 3b 0a 20 20 20 20 69  , &bNoop);.    i
36550 66 28 20 62 4e 6f 6f 70 20 7c 7c 20 72 63 20 29  f( bNoop || rc )
36560 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
36570 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
36580 20 20 20 20 69 66 28 20 70 4f 72 70 68 61 6e 3d      if( pOrphan=
36590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
365a0 72 70 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f  rphan = recoverO
365b0 72 70 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74  rphanTable(pStat
365c0 65 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64  e, &rc, zLostAnd
365d0 46 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b  Found, nOrphan);
365e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
365f0 54 61 62 20 3d 20 70 4f 72 70 68 61 6e 3b 0a 20  Tab = pOrphan;. 
36600 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
36610 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
36620 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
36630 74 65 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62  te3_stricmp(pTab
36640 2d 3e 7a 51 75 6f 74 65 64 2c 20 22 5c 22 73 71  ->zQuoted, "\"sq
36650 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 5c 22 22  lite_sequence\""
36660 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ) ){.      raw_p
36670 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
36680 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
36690 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
366a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
366b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
366c0 28 70 50 61 67 65 73 2c 20 31 2c 20 69 52 6f 6f  (pPages, 1, iRoo
366d0 74 29 3b 0a 20 20 20 20 69 66 28 20 62 52 6f 77  t);.    if( bRow
366e0 69 64 73 3d 3d 30 20 26 26 20 70 54 61 62 2d 3e  ids==0 && pTab->
366f0 69 50 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iPk<0 ){.      s
36700 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
36710 70 43 65 6c 6c 73 2c 20 31 2c 20 31 29 3b 0a 20  pCells, 1, 1);. 
36720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36730 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
36740 28 70 43 65 6c 6c 73 2c 20 31 2c 20 30 29 3b 0a  (pCells, 1, 0);.
36750 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36760 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
36770 73 2c 20 33 2c 20 70 54 61 62 2d 3e 69 50 6b 29  s, 3, pTab->iPk)
36780 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
36790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
367a0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
367b0 65 33 5f 73 74 65 70 28 70 50 61 67 65 73 29 20  e3_step(pPages) 
367c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  ){.      int iPg
367d0 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
367e0 75 6d 6e 5f 69 6e 74 28 70 50 61 67 65 73 2c 20  umn_int(pPages, 
367f0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
36800 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
36810 73 2c 20 32 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  s, 2, iPgno);.  
36820 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
36830 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
36840 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
36850 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a  step(pCells) ){.
36860 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65          int nFie
36870 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ld = sqlite3_col
36880 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  umn_int(pCells, 
36890 30 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  0);.        int 
368a0 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  iMin = sqlite3_c
368b0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73  olumn_int(pCells
368c0 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 2);.        co
368d0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
368e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
368f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
36900 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20  t(pCells, 1);.. 
36910 20 20 20 20 20 20 20 52 65 63 6f 76 65 72 54 61         RecoverTa
36920 62 6c 65 20 2a 70 54 61 62 32 20 3d 20 70 54 61  ble *pTab2 = pTa
36930 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
36940 54 61 62 21 3d 70 4f 72 70 68 61 6e 20 26 26 20  Tab!=pOrphan && 
36950 28 69 4d 69 6e 3c 30 29 21 3d 62 49 6e 74 6b 65  (iMin<0)!=bIntke
36960 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
36970 66 28 20 70 4f 72 70 68 61 6e 3d 3d 30 20 29 7b  f( pOrphan==0 ){
36980 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
36990 70 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72  phan = recoverOr
369a0 70 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65  phanTable(pState
369b0 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46  , &rc, zLostAndF
369c0 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a  ound, nOrphan);.
369d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
369e0 20 20 20 20 20 20 70 54 61 62 32 20 3d 20 70 4f        pTab2 = pO
369f0 72 70 68 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  rphan;.         
36a00 20 69 66 28 20 70 54 61 62 32 3d 3d 30 20 29 20   if( pTab2==0 ) 
36a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
36a20 0a 0a 20 20 20 20 20 20 20 20 6e 46 69 65 6c 64  ..        nField
36a30 20 3d 20 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 20   = nField+1;.   
36a40 20 20 20 20 20 69 66 28 20 70 54 61 62 32 3d 3d       if( pTab2==
36a50 70 4f 72 70 68 61 6e 20 29 7b 0a 20 20 20 20 20  pOrphan ){.     
36a60 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36a70 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
36a80 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
36a90 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55  ERT INTO %s VALU
36aa0 45 53 28 25 64 2c 20 25 64 2c 20 25 64 2c 20 25  ES(%d, %d, %d, %
36ab0 73 25 73 25 73 29 3b 5c 6e 22 2c 0a 20 20 20 20  s%s%s);\n",.    
36ac0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 32 2d            pTab2-
36ad0 3e 7a 51 75 6f 74 65 64 2c 20 69 52 6f 6f 74 2c  >zQuoted, iRoot,
36ae0 20 69 50 67 6e 6f 2c 20 6e 46 69 65 6c 64 2c 0a   iPgno, nField,.
36af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4d                iM
36b00 69 6e 3c 30 20 3f 20 22 22 20 3a 20 22 4e 55 4c  in<0 ? "" : "NUL
36b10 4c 2c 20 22 2c 20 7a 56 61 6c 2c 20 70 54 61 62  L, ", zVal, pTab
36b20 32 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64  2->azlCol[nField
36b30 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
36b40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
36b50 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36b60 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
36b70 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28  "INSERT INTO %s(
36b80 25 73 29 20 56 41 4c 55 45 53 28 20 25 73 20 29  %s) VALUES( %s )
36b90 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ;\n", .         
36ba0 20 20 20 20 20 70 54 61 62 32 2d 3e 7a 51 75 6f       pTab2->zQuo
36bb0 74 65 64 2c 20 70 54 61 62 32 2d 3e 61 7a 6c 43  ted, pTab2->azlC
36bc0 6f 6c 5b 6e 46 69 65 6c 64 5d 2c 20 7a 56 61 6c  ol[nField], zVal
36bd0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
36be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36bf0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
36c00 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20  (&rc, pCells);. 
36c10 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 52 65     }.    shellRe
36c20 73 65 74 28 26 72 63 2c 20 70 50 61 67 65 73 29  set(&rc, pPages)
36c30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 21 3d  ;.    if( pTab!=
36c40 70 4f 72 70 68 61 6e 20 29 20 72 65 63 6f 76 65  pOrphan ) recove
36c50 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
36c60 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e  ;.  }.  shellFin
36c70 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70  alize(&rc, pLoop
36c80 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  );.  shellFinali
36c90 7a 65 28 26 72 63 2c 20 70 50 61 67 65 73 29 3b  ze(&rc, pPages);
36ca0 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
36cb0 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20  (&rc, pCells);. 
36cc0 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
36cd0 65 28 70 4f 72 70 68 61 6e 29 3b 0a 0a 20 20 2f  e(pOrphan);..  /
36ce0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
36cf0 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69 66  e schema */.  if
36d00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36d10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
36d20 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
36d30 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
36d40 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
36d50 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
36d60 43 54 20 73 71 6c 2c 20 6e 61 6d 65 20 46 52 4f  CT sql, name FRO
36d70 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
36d80 61 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  a ".        "WHE
36d90 52 45 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20  RE sql NOT LIKE 
36da0 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27 22  'create table%'"
36db0 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a  , &pStmt.    );.
36dc0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
36dd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
36de0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
36df0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
36e00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36e10 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zSql = (const c
36e20 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
36e30 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
36e40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  0);.      if( sq
36e50 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
36e60 53 71 6c 2c 20 22 63 72 65 61 74 65 20 76 69 72  Sql, "create vir
36e70 74 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20 20  t", 11)==0 ){.  
36e80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
36e90 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
36ea0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
36eb0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
36ec0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 68  , 1);.        ch
36ed0 61 72 20 2a 7a 50 72 69 6e 74 20 3d 20 73 68 65  ar *zPrint = she
36ee0 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 0a  llMPrintf(&rc, .
36ef0 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
36f00 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
36f10 73 74 65 72 20 56 41 4c 55 45 53 28 27 74 61 62  ster VALUES('tab
36f20 6c 65 27 2c 20 25 51 2c 20 25 51 2c 20 30 2c 20  le', %Q, %Q, 0, 
36f30 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
36f40 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 53  zName, zName, zS
36f50 71 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ql.        );.  
36f60 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36f70 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25  (pState->out, "%
36f80 73 3b 5c 6e 22 2c 20 7a 50 72 69 6e 74 29 3b 0a  s;\n", zPrint);.
36f90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36fa0 66 72 65 65 28 7a 50 72 69 6e 74 29 3b 0a 20 20  free(zPrint);.  
36fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36fc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
36fd0 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c  tate->out, "%s;\
36fe0 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
36ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65   }.    }.    she
37000 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
37010 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  pStmt);.  }..  i
37020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37030 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
37040 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
37050 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
37060 5f 73 63 68 65 6d 61 20 3d 20 6f 66 66 3b 5c 6e  _schema = off;\n
37070 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
37080 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
37090 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
370a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  }.  sqlite3_exec
370b0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 44 45  (pState->db, "DE
370c0 54 41 43 48 20 72 65 63 6f 76 65 72 79 22 2c 20  TACH recovery", 
370d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  0, 0, 0);.  retu
370e0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
370f0 2f 2a 20 21 28 53 51 4c 49 54 45 5f 4f 4d 49 54  /* !(SQLITE_OMIT
37100 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
37110 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
37120 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
37130 54 41 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TAB) */.../*.** 
37140 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65  If an input line
37150 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22   begins with "."
37160 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69   then invoke thi
37170 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20  s routine to.** 
37180 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e  process that lin
37190 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
371a0 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f  1 on error, 2 to
371b0 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68   exit, and 0 oth
371c0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
371d0 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f  c int do_meta_co
371e0 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e  mmand(char *zLin
371f0 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  e, ShellState *p
37200 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a  ){.  int h = 1;.
37210 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
37220 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e    int n, c;.  in
37230 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72  t rc = 0;.  char
37240 20 2a 61 7a 41 72 67 5b 35 32 5d 3b 0a 0a 23 69   *azArg[52];..#i
37250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37260 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
37270 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70   if( p->expert.p
37280 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78  Expert ){.    ex
37290 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c  pertFinish(p, 1,
372a0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
372b0 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
372c0 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
372d0 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
372e0 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
372f0 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
37300 28 61 7a 41 72 67 29 2d 31 20 29 7b 0a 20 20 20  (azArg)-1 ){.   
37310 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
37320 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
37330 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ; }.    if( zLin
37340 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  e[h]==0 ) break;
37350 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
37360 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65  ]=='\'' || zLine
37370 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [h]=='"' ){.    
37380 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c    int delim = zL
37390 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20  ine[h++];.      
373a0 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
373b0 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
373c0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
373d0 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65   && zLine[h]!=de
373e0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lim ){.        i
373f0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c  f( zLine[h]=='\\
37400 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20  ' && delim=='"' 
37410 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30  && zLine[h+1]!=0
37420 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) h++;.        
37430 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h++;.      }.   
37440 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
37450 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
37460 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30    zLine[h++] = 0
37470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37480 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
37490 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
374a0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
374b0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
374c0 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
374d0 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
374e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
374f0 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61  ine[h] && !IsSpa
37500 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
37510 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  h++; }.      if(
37520 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e   zLine[h] ) zLin
37530 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
37540 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c    resolve_backsl
37550 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
37560 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -1]);.    }.  }.
37570 20 20 61 7a 41 72 67 5b 6e 41 72 67 5d 20 3d 20    azArg[nArg] = 
37580 30 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  0;..  /* Process
37590 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e   the input line.
375a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
375b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
375c0 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f  /* no tokens, no
375d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20   error */.  n = 
375e0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30  strlen30(azArg[0
375f0 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b  ]);.  c = azArg[
37600 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65  0][0];.  clearTe
37610 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e  mpFile(p);..#ifn
37620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37630 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
37640 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
37650 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37660 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  "auth", n)==0 ){
37670 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
37680 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
37690 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
376a0 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46  age: .auth ON|OF
376b0 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  F\n");.      rc 
376c0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
376d0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
376e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
376f0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
37700 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
37710 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
37720 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
37730 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
37740 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b  , shellAuth, p);
37750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37760 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
37770 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
37780 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
37790 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
377a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
377b0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
377c0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
377d0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
377e0 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
377f0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
37800 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29  ], "archive", n)
37810 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
37820 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
37830 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28   = arDotCommand(
37840 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72  p, 0, azArg, nAr
37850 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
37860 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
37870 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
37880 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
37890 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
378a0 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
378b0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
378c0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
378d0 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
378e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
378f0 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
37900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
37910 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b