/ Hex Artifact Content
Login

Artifact 63b1075817997806d7f09c2a0433ffac854b6dee47836ef938d51531cdb8042f:


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 49 4e 43  te3expert.c..INC
62f0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6300: 2f 64 62 64 61 74 61 2e 63 0a 0a 23 69 66 20 64  /dbdata.c..#if d
6310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6320: 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a  ABLE_SESSION)./*
6330: 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d  .** State inform
6340: 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ation for a sing
6350: 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a  le open session.
6360: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
6370: 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70  t OpenSession Op
6380: 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63  enSession;.struc
6390: 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a  t OpenSession {.
63a0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
63c0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20  mbolic name for 
63d0: 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  this session */.
63e0: 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20    int nFilter;  
63f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6400: 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20  mber of xFilter 
6410: 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70  rejection GLOB p
6420: 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61  atterns */.  cha
6430: 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20  r **azFilter;   
6440: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
6450: 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74  f xFilter reject
6460: 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e  ion GLOB pattern
6470: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
6480: 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20  ession *p;      
6490: 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73  /* The open sess
64a0: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66  ion */.};.#endif
64b0: 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75  ../*.** Shell ou
64c0: 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d  tput mode inform
64d0: 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72  ation from befor
64e0: 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c  e ".explain on",
64f0: 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61  .** saved so tha
6500: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 74  t it can be rest
6510: 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69  ored by ".explai
6520: 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65  n off".*/.typede
6530: 66 20 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f  f struct SavedMo
6540: 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65  deInfo SavedMode
6550: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76  Info;.struct Sav
6560: 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69  edModeInfo {.  i
6570: 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20  nt valid;       
6580: 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c     /* Is there l
6590: 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72  egit data in her
65a0: 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  e? */.  int mode
65b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
65c0: 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65  ode prior to ".e
65d0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
65e0: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20  int showHeader; 
65f0: 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61      /* The ".hea
6600: 64 65 72 22 20 73 65 74 74 69 6e 67 20 70 72 69  der" setting pri
6610: 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20  or to ".explain 
6620: 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c  on" */.  int col
6630: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
6640: 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72  Column widths pr
6650: 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e  ior to ".explain
6660: 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65   on" */.};..type
6670: 64 65 66 20 73 74 72 75 63 74 20 45 78 70 65 72  def struct Exper
6680: 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e 66 6f  tInfo ExpertInfo
6690: 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72 74 49  ;.struct ExpertI
66a0: 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 65  nfo {.  sqlite3e
66b0: 78 70 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a  xpert *pExpert;.
66c0: 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a    int bVerbose;.
66d0: 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20  };../* A single 
66e0: 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51 50 20  line in the EQP 
66f0: 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65 64 65  output */.typede
6700: 66 20 73 74 72 75 63 74 20 45 51 50 47 72 61 70  f struct EQPGrap
6710: 68 52 6f 77 20 45 51 50 47 72 61 70 68 52 6f 77  hRow EQPGraphRow
6720: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6730: 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69 45 71  hRow {.  int iEq
6740: 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pId;           /
6750: 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20 72 6f  * ID for this ro
6760: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  w */.  int iPare
6770: 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  ntId;        /* 
6780: 49 44 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ID of the parent
6790: 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47 72 61   row */.  EQPGra
67a0: 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20 20 20  phRow *pNext;   
67b0: 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e 20 73  /* Next row in s
67c0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63 68 61  equence */.  cha
67d0: 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20 20 20  r zText[1];     
67e0: 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 64 69     /* Text to di
67f0: 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73 20 72  splay for this r
6800: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6c 6c  ow */.};../* All
6810: 20 45 51 50 20 6f 75 74 70 75 74 20 69 73 20 63   EQP output is c
6820: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 6e  ollected into an
6830: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6840: 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 74 79   following */.ty
6850: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6860: 47 72 61 70 68 20 45 51 50 47 72 61 70 68 3b 0a  Graph EQPGraph;.
6870: 73 74 72 75 63 74 20 45 51 50 47 72 61 70 68 20  struct EQPGraph 
6880: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
6890: 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c 69 6e  *pRow;    /* Lin
68a0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
68b0: 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51 50 20  rows of the EQP 
68c0: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51 50 47  output */.  EQPG
68d0: 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74 3b 20  raphRow *pLast; 
68e0: 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d 65 6e    /* Last elemen
68f0: 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20 6c 69  t of the pRow li
6900: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 50 72  st */.  char zPr
6910: 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20 2f 2a  efix[100];    /*
6920: 20 47 72 61 70 68 20 70 72 65 66 69 78 20 2a 2f   Graph prefix */
6930: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65  .};../*.** State
6940: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6950: 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ut the database 
6960: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f  connection is co
6970: 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a  ntained in an.**
6980: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6990: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
69a0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
69b0: 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61   struct ShellSta
69c0: 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73  te ShellState;.s
69d0: 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65  truct ShellState
69e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
6a00: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
6a10: 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b   u8 autoExplain;
6a20: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
6a30: 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e  atically turn on
6a40: 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a   .explain mode *
6a50: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 3b 20  /.  u8 autoEQP; 
6a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
6a70: 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
6a80: 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73 65  PLAN prior to se
6a90: 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a  ach SQL stmt */.
6aa0: 20 20 75 38 20 61 75 74 6f 45 51 50 74 65 73 74    u8 autoEQPtest
6ab0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75 74 6f  ;        /* auto
6ac0: 45 51 50 20 69 73 20 69 6e 20 74 65 73 74 20 6d  EQP is in test m
6ad0: 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f  ode */.  u8 auto
6ae0: 45 51 50 74 72 61 63 65 3b 20 20 20 20 20 20 20  EQPtrace;       
6af0: 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20 69 6e  /* autoEQP is in
6b00: 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f 0a 20   trace mode */. 
6b10: 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20 20 20   u8 statsOn;    
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6b30: 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72  to display memor
6b40: 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65  y stats before e
6b50: 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a  ach finalize */.
6b60: 20 20 75 38 20 73 63 61 6e 73 74 61 74 73 4f 6e    u8 scanstatsOn
6b70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
6b80: 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e   to display scan
6b90: 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61   stats before ea
6ba0: 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20  ch finalize */. 
6bb0: 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20   u8 openMode;   
6bc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c          /* SHELL
6bd0: 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41  _OPEN_NORMAL, _A
6be0: 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49  PPENDVFS, or _ZI
6bf0: 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f  PFILE */.  u8 do
6c00: 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  XdgOpen;        
6c10: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72    /* Invoke star
6c20: 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
6c30: 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28  in output_reset(
6c40: 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70 4c 65  ) */.  u8 nEqpLe
6c50: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  vel;          /*
6c60: 20 44 65 70 74 68 20 6f 66 20 74 68 65 20 45 51   Depth of the EQ
6c70: 50 20 6f 75 74 70 75 74 20 67 72 61 70 68 20 2a  P output graph *
6c80: 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54 79 70  /.  u8 eTraceTyp
6c90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48  e;         /* SH
6ca0: 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61 6c 75  ELL_TRACE_* valu
6cb0: 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20 74 72  e for type of tr
6cc0: 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ace */.  unsigne
6cd0: 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20 20 20  d mEqpLines;    
6ce0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72 69 74  /* Mask of verit
6cf0: 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20 74 68  ical lines in th
6d00: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6d10: 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43  ph */.  int outC
6d20: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
6d30: 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64 6f  * Revert to stdo
6d40: 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e 67  ut when reaching
6d50: 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63   zero */.  int c
6d60: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
6d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
6d80: 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64  ecords displayed
6d90: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74   so far */.  int
6da0: 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
6db0: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
6dc0: 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e 65 20  er of last line 
6dd0: 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a 2f 0a  read from in */.
6de0: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
6df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6e00: 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d 20 74   commands from t
6e10: 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20  his stream */.  
6e20: 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
6e30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
6e40: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6e50: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74    FILE *traceOut
6e60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  ;        /* Outp
6e70: 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74  ut for sqlite3_t
6e80: 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  race() */.  int 
6e90: 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  nErr;           
6ea0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6eb0: 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20  errors seen */. 
6ec0: 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20   int mode;      
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75          /* An ou
6ee0: 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e  tput mode settin
6ef0: 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 50  g */.  int modeP
6f00: 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rior;         /*
6f10: 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f 0a 20   Saved mode */. 
6f20: 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20   int cMode;     
6f30: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f          /* tempo
6f40: 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65  rary output mode
6f50: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
6f60: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
6f70: 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20  normalMode;     
6f80: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64     /* Output mod
6f90: 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61  e before ".expla
6fa0: 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  in on" */.  int 
6fb0: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
6fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
6fd0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
6fe0: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
6ff0: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
7000: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
7010: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
7020: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
7030: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  mn mode */.  int
7040: 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20   nCheck;        
7050: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7060: 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e   ".check" comman
7070: 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69  ds run */.  unsi
7080: 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73 3b 20  gned nProgress; 
7090: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
70a0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
70b0: 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  ks encountered *
70c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 78 50  /.  unsigned mxP
70d0: 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20 4d 61  rogress;   /* Ma
70e0: 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73 20 63  ximum progress c
70f0: 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72 65 20  allbacks before 
7100: 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75 6e 73  failing */.  uns
7110: 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72 65 73  igned flgProgres
7120: 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72  s;  /* Flags for
7130: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
7140: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  llback */.  unsi
7150: 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20  gned shellFlgs; 
7160: 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
7170: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
7180: 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20 20 20  _int64 szMax;   
7190: 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61 72 67  /* --maxsize arg
71a0: 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e 20 2a  ument to .open *
71b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
71c0: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
71d0: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
71e0: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
71f0: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
7200: 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b 20 20  ar *zTempFile;  
7210: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
7220: 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69 67 68  y file that migh
7230: 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e 67 20  t need deleting 
7240: 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74 63  */.  char zTestc
7250: 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20 4e  ase[30];    /* N
7260: 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ame of current t
7270: 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20 63 68  est case */.  ch
7280: 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  ar colSeparator[
7290: 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73  20]; /* Column s
72a0: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
72b0: 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20 6d  er for several m
72c0: 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 72  odes */.  char r
72d0: 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b  owSeparator[20];
72e0: 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74 6f   /* Row separato
72f0: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
7300: 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20 20  MODE_Ascii */.  
7310: 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69 6f 72  char colSepPrior
7320: 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20  [20];  /* Saved 
7330: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
7340: 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65   */.  char rowSe
7350: 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20  pPrior[20];  /* 
7360: 53 61 76 65 64 20 72 6f 77 20 73 65 70 61 72 61  Saved row separa
7370: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c  tor */.  int col
7380: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20  Width[100];     
7390: 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77 69 64  /* Requested wid
73a0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73b0: 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e  n when in column
73c0: 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63   mode*/.  int ac
73d0: 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20  tualWidth[100]; 
73e0: 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68   /* Actual width
73f0: 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
7400: 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c 56 61  */.  char nullVa
7410: 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54  lue[20];    /* T
7420: 68 65 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74  he text to print
7430: 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
7440: 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20  es back from.   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7470: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
7480: 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45  outfile[FILENAME
7490: 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61  _MAX]; /* Filena
74a0: 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20  me for *out */. 
74b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
74c0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
74d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
74e0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
74f0: 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73  har *zFreeOnClos
7500: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  e;         /* Fi
7510: 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77  lename to free w
7520: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
7530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
7540: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
7550: 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75  Name of VFS to u
7560: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7570: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
7580: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
7590: 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ent if any. */. 
75a0: 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20   FILE *pLog;    
75b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
75c0: 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65   log output here
75d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64   */.  int *aiInd
75e0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ent;         /* 
75f0: 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73  Array of indents
7600: 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78   used in MODE_Ex
7610: 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  plain */.  int n
7620: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
7630: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
7640: 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  ay aiIndent[] */
7650: 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20  .  int iIndent; 
7660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7670: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70  ex of current op
7680: 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   in aiIndent[] *
7690: 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73 47 72  /.  EQPGraph sGr
76a0: 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  aph;       /* In
76b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
76c0: 65 20 67 72 61 70 68 69 63 61 6c 20 45 58 50 4c  e graphical EXPL
76d0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 2a  AIN QUERY PLAN *
76e0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
76f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
7700: 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65 73 73  ION).  int nSess
7710: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
7720: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
7730: 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20 2a 2f  tive sessions */
7740: 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 61  .  OpenSession a
7750: 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20  Session[4];  /* 
7760: 41 72 72 61 79 20 6f 66 20 73 65 73 73 69 6f 6e  Array of session
7770: 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20 66 6f  s.  [0] is in fo
7780: 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  cus. */.#endif. 
7790: 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78 70 65   ExpertInfo expe
77a0: 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61  rt;        /* Va
77b0: 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75 73 20  lid if previous 
77c0: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e 65 78  command was ".ex
77d0: 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a  pert OPT..." */.
77e0: 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20  };.../* Allowed 
77f0: 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c  values for Shell
7800: 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a 2a 2f  State.autoEQP.*/
7810: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7820: 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20 20 20  _off      0     
7830: 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74        /* Automat
7840: 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ic EXPLAIN QUERY
7850: 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a 2f 0a   PLAN is off */.
7860: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
7870: 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20 20 20  on       1      
7880: 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69       /* Automati
7890: 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f 0a 23  c EQP is on */.#
78a0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 74  define AUTOEQP_t
78b0: 72 69 67 67 65 72 20 20 32 20 20 20 20 20 20 20  rigger  2       
78c0: 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20 61 6c      /* On and al
78d0: 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20 66 6f  so show plans fo
78e0: 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 23 64  r triggers */.#d
78f0: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 66 75  efine AUTOEQP_fu
7900: 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20 20 20  ll     3        
7910: 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c 6c 20     /* Show full 
7920: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 20 41  EXPLAIN */../* A
7930: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7940: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f 70 65  r ShellState.ope
7950: 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69 6e 65  nMode.*/.#define
7960: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
7970: 45 43 20 20 20 20 20 20 30 20 20 20 20 20 20 2f  EC      0      /
7980: 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65 20 73  * No open-mode s
7990: 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64 65 66  pecified */.#def
79a0: 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  ine SHELL_OPEN_N
79b0: 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20 20 20  ORMAL      1    
79c0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61 74 61    /* Normal data
79d0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 64 65  base file */.#de
79e0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79f0: 41 50 50 45 4e 44 56 46 53 20 20 20 32 20 20 20  APPENDVFS   2   
7a00: 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65 6e 64     /* Use append
7a10: 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  vfs */.#define S
7a20: 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
7a30: 45 20 20 20 20 20 33 20 20 20 20 20 20 2f 2a 20  E     3      /* 
7a40: 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20  Use the zipfile 
7a50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
7a60: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a70: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  PEN_READONLY    
7a80: 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  4      /* Open a
7a90: 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
7aa0: 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 23 64   read-only */.#d
7ab0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7ac0: 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35 20 20  _DESERIALIZE 5  
7ad0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73 69 6e      /* Open usin
7ae0: 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  g sqlite3_deseri
7af0: 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65 66 69  alize() */.#defi
7b00: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  ne SHELL_OPEN_HE
7b10: 58 44 42 20 20 20 20 20 20 20 36 20 20 20 20 20  XDB       6     
7b20: 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74 78 74   /* Use "dbtotxt
7b30: 22 20 6f 75 74 70 75 74 20 61 73 20 64 61 74 61  " output as data
7b40: 20 73 6f 75 72 63 65 20 2a 2f 0a 0a 2f 2a 20 41   source */../* A
7b50: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7b60: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 65 54 72  r ShellState.eTr
7b70: 61 63 65 54 79 70 65 0a 2a 2f 0a 23 64 65 66 69  aceType.*/.#defi
7b80: 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 50  ne SHELL_TRACE_P
7b90: 4c 41 49 4e 20 20 20 20 20 20 30 20 20 20 20 20  LAIN      0     
7ba0: 20 2f 2a 20 53 68 6f 77 20 69 6e 70 75 74 20 53   /* Show input S
7bb0: 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65 66 69  QL text */.#defi
7bc0: 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  ne SHELL_TRACE_E
7bd0: 58 50 41 4e 44 45 44 20 20 20 31 20 20 20 20 20  XPANDED   1     
7be0: 20 2f 2a 20 53 68 6f 77 20 65 78 70 61 6e 64 65   /* Show expande
7bf0: 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64  d SQL text */.#d
7c00: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43  efine SHELL_TRAC
7c10: 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 20 32 20 20  E_NORMALIZED 2  
7c20: 20 20 20 20 2f 2a 20 53 68 6f 77 20 6e 6f 72 6d      /* Show norm
7c30: 61 6c 69 7a 65 64 20 53 51 4c 20 74 65 78 74 20  alized SQL text 
7c40: 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20 69 6e 20 74  */../* Bits in t
7c50: 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 66 6c  he ShellState.fl
7c60: 67 50 72 6f 67 72 65 73 73 20 76 61 72 69 61 62  gProgress variab
7c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  le */.#define SH
7c80: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51 55 49  ELL_PROGRESS_QUI
7c90: 45 54 20 30 78 30 31 20 20 2f 2a 20 4f 6d 69 74  ET 0x01  /* Omit
7ca0: 20 61 6e 6e 6f 75 6e 63 69 6e 67 20 65 76 65 72   announcing ever
7cb0: 79 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  y progress callb
7cc0: 61 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ack */.#define S
7cd0: 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45  HELL_PROGRESS_RE
7ce0: 53 45 54 20 30 78 30 32 20 20 2f 2a 20 52 65 73  SET 0x02  /* Res
7cf0: 65 74 20 74 68 65 20 63 6f 75 6e 74 20 77 68 65  et the count whe
7d00: 6e 20 74 68 65 20 70 72 6f 67 72 65 73 0a 20 20  n the progres.  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6c 69 6d   ** callback lim
7d40: 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 61  it is reached, a
7d50: 6e 64 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  nd for each.    
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
7d80: 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 53 51 4c 20  * top-level SQL 
7d90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 23 64 65  statement */.#de
7da0: 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52  fine SHELL_PROGR
7db0: 45 53 53 5f 4f 4e 43 45 20 20 30 78 30 34 20 20  ESS_ONCE  0x04  
7dc0: 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20 2d 2d  /* Cancel the --
7dd0: 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69 72 69  limit after firi
7de0: 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ng once */../*.*
7df0: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7e00: 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67  allowed shellFlg
7e10: 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66  s values.*/.#def
7e20: 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61  ine SHFLG_Pageca
7e30: 63 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30  che      0x00000
7e40: 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67  001 /* The --pag
7e50: 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73  ecache option is
7e60: 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65   used */.#define
7e70: 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
7e80: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32        0x00000002
7e90: 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65   /* Lookaside me
7ea0: 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a  mory is used */.
7eb0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61  #define SHFLG_Ba
7ec0: 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30  ckslash      0x0
7ed0: 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d  0000004 /* The -
7ee0: 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f  -backslash optio
7ef0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7f00: 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65  fine SHFLG_Prese
7f10: 72 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30  rveRowid  0x0000
7f20: 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72  0008 /* .dump pr
7f30: 65 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61  eserves rowid va
7f40: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
7f50: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20  SHFLG_Newlines  
7f60: 20 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20       0x00000010 
7f70: 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69  /* .dump --newli
7f80: 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69  ne flag */.#defi
7f90: 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  ne SHFLG_CountCh
7fa0: 61 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30  anges   0x000000
7fb0: 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73  20 /* .changes s
7fc0: 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  etting */.#defin
7fd0: 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20  e SHFLG_Echo    
7fe0: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34         0x0000004
7ff0: 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d  0 /* .echo or --
8000: 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a  echo setting */.
8010: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 52 65  #define SHFLG_Re
8020: 63 6f 76 65 72 20 20 20 20 20 20 20 20 30 78 30  cover        0x0
8030: 30 30 30 30 30 38 30 20 2f 2a 20 2e 64 75 6d 70  0000080 /* .dump
8040: 20 69 73 20 2d 2d 72 65 63 6f 76 65 72 20 2a 2f   is --recover */
8050: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66  ../*.** Macros f
8060: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  or testing and s
8070: 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73  etting shellFlgs
8080: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  .*/.#define Shel
8090: 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20  lHasFlag(P,X)   
80a0: 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67   (((P)->shellFlg
80b0: 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65  s & (X))!=0).#de
80c0: 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61  fine ShellSetFla
80d0: 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e  g(P,X)    ((P)->
80e0: 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a  shellFlgs|=(X)).
80f0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65  #define ShellCle
8100: 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50  arFlag(P,X)  ((P
8110: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e  )->shellFlgs&=(~
8120: 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  (X)))../*.** The
8130: 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77  se are the allow
8140: 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  ed modes..*/.#de
8150: 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20  fine MODE_Line  
8160: 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c     0  /* One col
8170: 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42  umn per line.  B
8180: 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65  lank line betwee
8190: 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65  n records */.#de
81a0: 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  fine MODE_Column
81b0: 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63     1  /* One rec
81c0: 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20  ord per line in 
81d0: 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  neat columns */.
81e0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73  #define MODE_Lis
81f0: 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20  t     2  /* One 
8200: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
8210: 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72  with a separator
8220: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8230: 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20  _Semi     3  /* 
8240: 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73  Same as MODE_Lis
8250: 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22  t but append ";"
8260: 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   to each line */
8270: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74  .#define MODE_Ht
8280: 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e  ml     4  /* Gen
8290: 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74  erate an XHTML t
82a0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
82b0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20  MODE_Insert   5 
82c0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c   /* Generate SQL
82d0: 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d   "insert" statem
82e0: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
82f0: 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20  MODE_Quote    6 
8300: 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73   /* Quote values
8310: 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23   as for SQL */.#
8320: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20  define MODE_Tcl 
8330: 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72       7  /* Gener
8340: 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43  ate ANSI-C or TC
8350: 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74  L quoted element
8360: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
8370: 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a  E_Csv      8  /*
8380: 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20   Quote strings, 
8390: 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69  numbers are plai
83a0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  n */.#define MOD
83b0: 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a  E_Explain  9  /*
83c0: 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   Like MODE_Colum
83d0: 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72  n, but do not tr
83e0: 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23  uncate data */.#
83f0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69  define MODE_Asci
8400: 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41  i   10  /* Use A
8410: 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65  SCII unit and re
8420: 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73 20  cord separators 
8430: 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23  (0x1F/0x1E) */.#
8440: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74  define MODE_Pret
8450: 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74  ty  11  /* Prett
8460: 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20  y-print schemas 
8470: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8480: 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20 43  EQP     12  /* C
8490: 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e 20  onverts EXPLAIN 
84a0: 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75  QUERY PLAN outpu
84b0: 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20 2a  t into a graph *
84c0: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
84d0: 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b  char *modeDescr[
84e0: 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a  ] = {.  "line",.
84f0: 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c    "column",.  "l
8500: 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a  ist",.  "semi",.
8510: 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73    "html",.  "ins
8520: 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c  ert",.  "quote",
8530: 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76  .  "tcl",.  "csv
8540: 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a  ",.  "explain",.
8550: 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72    "ascii",.  "pr
8560: 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22 65  ettyprint",.  "e
8570: 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  qp".};../*.** Th
8580: 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75  ese are the colu
8590: 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61  mn/row/line sepa
85a0: 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74  rators used by t
85b0: 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d  he various.** im
85c0: 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65  port/export mode
85d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45  s..*/.#define SE
85e0: 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a  P_Column    "|".
85f0: 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20  #define SEP_Row 
8600: 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69        "\n".#defi
8610: 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20  ne SEP_Tab      
8620: 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45   "\t".#define SE
8630: 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a  P_Space     " ".
8640: 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d  #define SEP_Comm
8650: 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e  a     ",".#defin
8660: 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20  e SEP_CrLf      
8670: 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53  "\r\n".#define S
8680: 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78  EP_Unit      "\x
8690: 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  1F".#define SEP_
86a0: 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22  Record    "\x1E"
86b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62 61  ../*.** A callba
86c0: 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
86d0: 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66 61  e3_log() interfa
86e0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
86f0: 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69 64  id shellLog(void
8700: 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72   *pArg, int iErr
8710: 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Code, const char
8720: 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c 6c   *zMsg){.  Shell
8730: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
8740: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20  lState*)pArg;.  
8750: 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29  if( p->pLog==0 )
8760: 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38 5f   return;.  utf8_
8770: 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20  printf(p->pLog, 
8780: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
8790: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20  rCode, zMsg);.  
87a0: 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b  fflush(p->pLog);
87b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
87c0: 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70  nction:  shell_p
87d0: 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57  utsnl(X).**.** W
87e0: 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58 20  rite the text X 
87f0: 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28 6f  to the screen (o
8800: 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70 75  r whatever outpu
8810: 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65 63  t is being direc
8820: 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20 61  ted).** adding a
8830: 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65 20   newline at the 
8840: 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72 65  end, and then re
8850: 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  turn X..*/.stati
8860: 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74 73  c void shellPuts
8870: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8880: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20  context *pCtx,. 
8890: 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
88a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
88b0: 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  al.){.  ShellSta
88c0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
88d0: 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  ate*)sqlite3_use
88e0: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
88f0: 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75 74  (void)nVal;.  ut
8900: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
8910: 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
8920: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
8930: 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74  al[0]));.  sqlit
8940: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
8950: 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b  pCtx, apVal[0]);
8960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
8970: 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28 56  nction:   edit(V
8980: 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20 20  ALUE).**        
8990: 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56 41           edit(VA
89a0: 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a  LUE,EDITOR).**.*
89b0: 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a 2a  * These steps:.*
89c0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72 69  *.**     (1) Wri
89d0: 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61 20  te VALUE into a 
89e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
89f0: 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20 70  **     (2) Run p
8a00: 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f 6e  rogram EDITOR on
8a10: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
8a20: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29  file..**     (3)
8a30: 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f 72   Read the tempor
8a40: 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61 6e  ary file back an
8a50: 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f 6e  d return its con
8a60: 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73 75  tent as the resu
8a70: 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 44  lt..**     (4) D
8a80: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
8a90: 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49  ary file.**.** I
8aa0: 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72 67  f the EDITOR arg
8ab0: 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  ument is omitted
8ac0: 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  , use the value 
8ad0: 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a 2a  in the VISUAL.**
8ae0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
8af0: 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c 6c  iable.  If still
8b00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44 49   there is no EDI
8b10: 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e 20  TOR, through an 
8b20: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  error..**.** Als
8b30: 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  o throw an error
8b40: 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20 70   if the EDITOR p
8b50: 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20 61  rogram returns a
8b60: 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20 63   non-zero exit c
8b70: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ode..*/.#ifndef 
8b80: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
8b90: 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69 64  STEM.static void
8ba0: 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71 6c   editFunc(.  sql
8bb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8bc0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8bd0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8be0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
8bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69 74  onst char *zEdit
8c00: 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d  or;.  char *zTem
8c10: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8c20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
8c30: 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e   *zCmd = 0;.  in
8c40: 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72 63  t bBin;.  int rc
8c50: 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c 20  ;.  int hasCRNL 
8c60: 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  = 0;.  FILE *f =
8c70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
8c80: 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74 65  t64 sz;.  sqlite
8c90: 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e 73  3_int64 x;.  uns
8ca0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
8cb0: 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  0;..  if( argc==
8cc0: 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72  2 ){.    zEditor
8cd0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
8ce0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8cf0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
8d00: 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74 6f  else{.    zEdito
8d10: 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53 55  r = getenv("VISU
8d20: 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  AL");.  }.  if( 
8d30: 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20 20  zEditor==0 ){.  
8d40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8d50: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8d60: 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20 65  "no editor for e
8d70: 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20  dit()", -1);.   
8d80: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8d90: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
8da0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8db0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
8dc0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8dd0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8de0: 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20   "NULL input to 
8df0: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8e00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8e10: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8e20: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
8e30: 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d 70  ontext);.  zTemp
8e40: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
8e50: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
8e60: 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  (db, 0, SQLITE_F
8e70: 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
8e80: 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  E, &zTempFile);.
8e90: 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d    if( zTempFile=
8ea0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8eb0: 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b 0a  3_uint64 r = 0;.
8ec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
8ed0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
8ee0: 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d 70  , &r);.    zTemp
8ef0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
8f00: 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
8f10: 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  ", r);.    if( z
8f20: 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
8f30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8f40: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8f50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8f60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8f70: 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69 74  }.  bBin = sqlit
8f80: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
8f90: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42  gv[0])==SQLITE_B
8fa0: 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20 77  LOB;.  /* When w
8fb0: 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65 20  riting the file 
8fc0: 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64 6f  to be edited, do
8fd0: 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e 76   \n to \r\n conv
8fe0: 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74 65  ersions on syste
8ff0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61 6e  ms.  ** that wan
9000: 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64 69  t \r\n line endi
9010: 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f 70  ngs */.  f = fop
9020: 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62 42  en(zTempFile, bB
9030: 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22 29  in ? "wb" : "w")
9040: 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a  ;.  if( f==0 ){.
9050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9060: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9070: 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74  , "edit() cannot
9080: 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 22   open temp file"
9090: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
90a0: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
90b0: 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74 65   }.  sz = sqlite
90c0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
90d0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62 42  gv[0]);.  if( bB
90e0: 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66 77  in ){.    x = fw
90f0: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  rite(sqlite3_val
9100: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
9110: 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d  , 1, sz, f);.  }
9120: 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
9130: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
9140: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
9150: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9160: 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d  ]);.    /* Remem
9170: 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ber whether or n
9180: 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72 69  ot the value ori
9190: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
91a0: 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66  d \r\n */.    if
91b0: 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a 2c  ( z && strstr(z,
91c0: 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61 73  "\r\n")!=0 ) has
91d0: 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20  CRNL = 1;.    x 
91e0: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
91f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9200: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
9210: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
9220: 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  f = 0;.  if(
9230: 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71   x!=sz ){.    sq
9240: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9250: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69  or(context, "edi
9260: 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72  t() could not wr
9270: 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69  ite the whole fi
9280: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
9290: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
92a0: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73  ;.  }.  zCmd = s
92b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
92c0: 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69  %s \"%s\"", zEdi
92d0: 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b  tor, zTempFile);
92e0: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
92f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9300: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9310: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
9320: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
9330: 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  d;.  }.  rc = sy
9340: 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71  stem(zCmd);.  sq
9350: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
9360: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9370: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9380: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
9390: 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64  "EDITOR returned
93a0: 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b   non-zero", -1);
93b0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
93c0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66  unc_end;.  }.  f
93d0: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
93e0: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  le, "rb");.  if(
93f0: 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   f==0 ){.    sql
9400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9410: 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  r(context,.     
9420: 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20   "edit() cannot 
9430: 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  reopen temp file
9440: 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31   after edit", -1
9450: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
9460: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
9470: 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45   fseek(f, 0, SEE
9480: 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66  K_END);.  sz = f
9490: 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e  tell(f);.  rewin
94a0: 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  d(f);.  p = sqli
94b0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a  te3_malloc64( sz
94c0: 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20  +(bBin==0) );.  
94d0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
94e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
94f0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
9500: 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  xt);.    goto ed
9510: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
9520: 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20  .  x = fread(p, 
9530: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63 6c  1, sz, f);.  fcl
9540: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
9550: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
9560: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9570: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9580: 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "could not rea
9590: 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  d back the whole
95a0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
95b0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
95c0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  end;.  }.  if( b
95d0: 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Bin ){.    sqlit
95e0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34  e3_result_blob64
95f0: 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a 2c  (context, p, sz,
9600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
9610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9620: 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a 3b  ite3_int64 i, j;
9630: 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e 4c  .    if( hasCRNL
9640: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
9650: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
9660: 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e 20  tains \r\n then 
9670: 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  do no conversion
9680: 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a  s back to \n */.
9690: 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20 20        j = sz;.  
96a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
96b0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 69  * If the file di
96c0: 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79  d not originally
96d0: 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74 68   contain \r\n th
96e0: 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20 6e  en convert any n
96f0: 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c 6e  ew.      ** \r\n
9700: 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f   back into \n */
9710: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  .      for(i=j=0
9720: 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<sz; i++){.  
9730: 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d 3d        if( p[i]==
9740: 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d 3d  '\r' && p[i+1]==
9750: 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20  '\n' ) i++;.    
9760: 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69      p[j++] = p[i
9770: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
9780: 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70   sz = j;.      p
9790: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 20  [sz] = 0;.    } 
97a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
97b0: 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65  ult_text64(conte
97c0: 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  xt, (const char*
97d0: 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20  )p, sz,.        
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20    sqlite3_free, 
9800: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
9810: 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74  }.  p = 0;..edit
9820: 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28  _func_end:.  if(
9830: 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a   f ) fclose(f);.
9840: 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69    unlink(zTempFi
9850: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
9860: 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ree(zTempFile);.
9870: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9880: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9890: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
98a0: 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61  TEM */../*.** Sa
98b0: 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68  ve or restore th
98c0: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
98d0: 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20   mode.*/.static 
98e0: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
98f0: 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ush(ShellState *
9900: 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69  p){.  p->modePri
9910: 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  or = p->mode;.  
9920: 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70  memcpy(p->colSep
9930: 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  Prior, p->colSep
9940: 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70  arator, sizeof(p
9950: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29  ->colSeparator))
9960: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f  ;.  memcpy(p->ro
9970: 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f  wSepPrior, p->ro
9980: 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  wSeparator, size
9990: 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
99a0: 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  or));.}.static v
99b0: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f  oid outputModePo
99c0: 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  p(ShellState *p)
99d0: 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  {.  p->mode = p-
99e0: 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65  >modePrior;.  me
99f0: 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72  mcpy(p->colSepar
9a00: 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50  ator, p->colSepP
9a10: 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  rior, sizeof(p->
9a20: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  colSeparator));.
9a30: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53    memcpy(p->rowS
9a40: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77  eparator, p->row
9a50: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9a60: 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
9a70: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ));.}../*.** Out
9a80: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9a90: 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e  ring as a hex-en
9aa0: 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20  coded blob (eg. 
9ab0: 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61  X'1234' ).*/.sta
9ac0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
9ad0: 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f  hex_blob(FILE *o
9ae0: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
9af0: 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
9b00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9b10: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61  ar *zBlob = (cha
9b20: 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77  r *)pBlob;.  raw
9b30: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22  _printf(out,"X'"
9b40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9b50: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77  nBlob; i++){ raw
9b60: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32  _printf(out,"%02
9b70: 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66  x",zBlob[i]&0xff
9b80: 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  ); }.  raw_print
9b90: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
9ba0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69  *.** Find a stri
9bb0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  ng that is not f
9bc0: 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e  ound anywhere in
9bd0: 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20   z[].  Return a 
9be0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9bf0: 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  at string..**.**
9c00: 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61   Try to use zA a
9c10: 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66  nd zB first.  If
9c20: 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61   both of those a
9c30: 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64  re already found
9c40: 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20   in z[].** then 
9c50: 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72  make up some str
9c60: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ing and store it
9c70: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a   in the buffer z
9c80: 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  Buf..*/.static c
9c90: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65  onst char *unuse
9ca0: 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  d_string(.  cons
9cb0: 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74   Result must not
9ce0: 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65   appear anywhere
9cf0: 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74   in z */.  const
9d00: 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74   char *zA, const
9d10: 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20   char *zB,   /* 
9d20: 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20  Try these first 
9d30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  */.  char *zBuf 
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9d60: 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72  to store a gener
9d70: 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  ated string */.)
9d80: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d  {.  unsigned i =
9d90: 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72   0;.  if( strstr
9da0: 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74  (z, zA)==0 ) ret
9db0: 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74  urn zA;.  if( st
9dc0: 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29  rstr(z, zB)==0 )
9dd0: 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f   return zB;.  do
9de0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
9df0: 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22  printf(20,zBuf,"
9e00: 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b  (%s%u)", zA, i++
9e10: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72  );.  }while( str
9e20: 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29  str(z,zBuf)!=0 )
9e30: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
9e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9e50: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9e60: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
9e70: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
9e80: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
9e90: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ns..**.** See al
9ea0: 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  so: output_quote
9eb0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
9ec0: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
9ed0: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
9ee0: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
9ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
9f00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
9f10: 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79  r c;.  setBinary
9f20: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20  Mode(out, 1);.  
9f30: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9f40: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9f50: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
9f60: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  c==0 ){.    utf8
9f70: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  _printf(out,"'%s
9f80: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
9f90: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9fa0: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68  ut, "'");.    wh
9fb0: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
9fc0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9fd0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9fe0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
9ff0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
a000: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
a010: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
a020: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
a030: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
a040: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
a050: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a060: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
a070: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a080: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
a090: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a0a0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
a0b0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
a0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a0d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ++;.    }.    ra
a0e0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
a0f0: 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78  ");.  }.  setTex
a100: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
a110: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
a120: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a130: 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  as a quoted stri
a140: 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f  ng using SQL quo
a150: 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ting conventions
a160: 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ..** Additionall
a170: 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20  ly , escape the 
a180: 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68  "\n" and "\r" ch
a190: 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74  aracters so that
a1a0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20   they do not.** 
a1b0: 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79  get corrupted by
a1c0: 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61   end-of-line tra
a1d0: 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74  nslation facilit
a1e0: 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72  ies in some oper
a1f0: 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
a200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
a210: 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74  like output_quot
a220: 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20  ed_string() but 
a230: 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
a240: 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a  n of the \r\n.**
a250: 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73   escape mechanis
a260: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
a270: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
a280: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46  escaped_string(F
a290: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
a2a0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
a2b0: 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73  i;.  char c;.  s
a2c0: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74  etBinaryMode(out
a2d0: 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 1);.  for(i=0;
a2e0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a2f0: 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d  & c!='\'' && c!=
a300: 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b  '\n' && c!='\r';
a310: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d   i++){}.  if( c=
a320: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
a330: 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22  rintf(out,"'%s'"
a340: 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ,z);.  }else{.  
a350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a360: 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  L = 0;.    const
a370: 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a   char *zCR = 0;.
a380: 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b      int nNL = 0;
a390: 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
a3a0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31  ;.    char zBuf1
a3b0: 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b  [20], zBuf2[20];
a3c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
a3d0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
a3e0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
a3f0: 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nNL++;.      if
a400: 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e  ( z[i]=='\r' ) n
a410: 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CR++;.    }.    
a420: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a430: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a440: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a450: 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64      zNL = unused
a460: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22  _string(z, "\\n"
a470: 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31  , "\\012", zBuf1
a480: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a490: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
a4a0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
a4b0: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
a4c0: 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74   zCR = unused_st
a4d0: 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22  ring(z, "\\r", "
a4e0: 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a  \\015", zBuf2);.
a4f0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a500: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a510: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
a520: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a530: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
a540: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
a550: 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  \r' && c!='\''; 
a560: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
a570: 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a   c=='\'' ) i++;.
a580: 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20        if( i ){. 
a590: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a5a0: 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  tf(out, "%.*s", 
a5b0: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
a5c0: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
a5d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
a5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
a5f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
a600: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
a610: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
a620: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a640: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
a650: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
a660: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a670: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a680: 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20  ", zNL);.       
a690: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a6a0: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
a6b0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
a6c0: 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  CR);.    }.    r
a6d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a6e0: 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52  '");.    if( nCR
a6f0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a700: 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27  intf(out, ",'%s'
a710: 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52  ,char(13))", zCR
a720: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a730: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
a740: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a750: 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c  '%s',char(10))",
a760: 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   zNL);.    }.  }
a770: 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f  .  setTextMode(o
a780: 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut, 1);.}../*.**
a790: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a7a0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
a7b0: 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  oted according t
a7c0: 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69  o C or TCL quoti
a7d0: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ng rules..*/.sta
a7e0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a7f0: 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  c_string(FILE *o
a800: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
a810: 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  z){.  unsigned i
a820: 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22  nt c;.  fputc('"
a830: 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65  ', out);.  while
a840: 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d  ( (c = *(z++))!=
a850: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  0 ){.    if( c==
a860: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\\' ){.      fp
a870: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a880: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a890: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8a0: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
a8b0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a8c0: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22  ;.      fputc('"
a8d0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a8e0: 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29  se if( c=='\t' )
a8f0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a900: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a910: 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b  fputc('t', out);
a920: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a930: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
a940: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a950: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e  ;.      fputc('n
a960: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a970: 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29  se if( c=='\r' )
a980: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a990: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a9a0: 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b  fputc('r', out);
a9b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a9c0: 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20  isprint(c&0xff) 
a9d0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a9e0: 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f  ntf(out, "\\%03o
a9f0: 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20  ", c&0xff);.    
aa00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75  }else{.      fpu
aa10: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
aa20: 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22  }.  }.  fputc('"
aa30: 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ', out);.}../*.*
aa40: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
aa50: 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63  en string with c
aa60: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
aa70: 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a  re special to.**
aa80: 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a   HTML escaped..*
aa90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
aaa0: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
aab0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
aac0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
aad0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  t i;.  if( z==0 
aae0: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c  ) z = "";.  whil
aaf0: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72  e( *z ){.    for
ab00: 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20  (i=0;   z[i].   
ab10: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
ab20: 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20  !='<'.          
ab30: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20    && z[i]!='&'. 
ab40: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
ab50: 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20  i]!='>'.        
ab60: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22      && z[i]!='\"
ab70: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab80: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20   z[i]!='\'';.   
ab90: 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20       i++){}.    
aba0: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
abb0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
abc0: 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20  ,"%.*s",i,z);.  
abd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
abe0: 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72  =='<' ){.      r
abf0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
ac00: 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lt;");.    }else
ac10: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29   if( z[i]=='&' )
ac20: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
ac30: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
ac40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
ac50: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
ac60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac70: 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&gt;");.    }e
ac80: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
ac90: 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  "' ){.      raw_
aca0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f  printf(out,"&quo
acb0: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
acc0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
acd0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
ace0: 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b  tf(out,"&#39;");
acf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ad10: 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20     z += i + 1;. 
ad20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
ad30: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
ad40: 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64  any character id
ad50: 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20  entified by a 1 
ad60: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
ad70: 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20  .** array, then 
ad80: 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  the string must 
ad90: 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53  be quoted for CS
ada0: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  V..*/.static con
adb0: 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51  st char needCsvQ
adc0: 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20  uote[] = {.  1, 
add0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ade0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
adf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
ae00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae10: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
ae20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae30: 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c  1,.  1, 0, 1, 0,
ae40: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30   0, 0, 0, 1,   0
ae50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae60: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
ae70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae80: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
aea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aeb0: 2c 20 30 2c 20 20 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 20 30 2c 0a 20  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 30 2c 20 20 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 20   0, 0, 0, 0, 0, 
af00: 30 2c 0a 20 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 30 2c 20 20 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 20 30 2c 0a 20 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 30 2c  , 0, 0, 0, 0, 0,
af50: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
af60: 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20  , 0, 0, 1,.  1, 
af70: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af80: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
afa0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afb0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
afc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afd0: 31 2c 0a 20 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 31 2c 20 20 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 20 31 2c 0a 20 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 31 2c  , 1, 1, 1, 1, 1,
b020: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b030: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 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 31 2c 20 20 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 20 31 2c 0a 20  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 31 2c 20 20 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 20   1, 1, 1, 1, 1, 
b0a0: 31 2c 0a 20 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 31 2c 20 20 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 20 31 2c 0a 20 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 31 2c  , 1, 1, 1, 1, 1,
b0f0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b100: 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f  , 1, 1, 1,.};../
b110: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69  *.** Output a si
b120: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56  ngle term of CSV
b130: 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e  .  Actually, p->
b140: 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20  colSeparator is 
b150: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  used for.** the 
b160: 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68  separator, which
b170: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
b180: 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e  be a comma.  p->
b190: 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20  nullValue is.** 
b1a0: 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20  the null value. 
b1b0: 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f   Strings are quo
b1c0: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
b1d0: 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72  .  The separator
b1e0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75  .** is only issu
b1f0: 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72  ed if bSep is tr
b200: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
b210: 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68  id output_csv(Sh
b220: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
b230: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b240: 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f  bSep){.  FILE *o
b250: 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69  ut = p->out;.  i
b260: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( z==0 ){.    u
b270: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
b280: 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  %s",p->nullValue
b290: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b2a0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
b2b0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
b2c0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
b2d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
b2e0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b2f0: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
b300: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
b310: 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20  *)z)[i]].       
b320: 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63    || (z[i]==p->c
b330: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26  olSeparator[0] &
b340: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
b350: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
b360: 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  p(z, p->colSepar
b370: 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29  ator, nSep)==0))
b380: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
b390: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
b3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b3b0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
b3c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f        char *zQuo
b3d0: 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ted = sqlite3_mp
b3e0: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
b3f0: 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  z);.      utf8_p
b400: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b410: 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20   zQuoted);.     
b420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
b430: 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73  uoted);.    }els
b440: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
b450: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
b460: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
b470: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
b480: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b490: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
b4a0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a  Separator);.  }.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b4c0: 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20  utine runs when 
b4d0: 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73  the user presses
b4e0: 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69   Ctrl-C.*/.stati
b4f0: 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74  c void interrupt
b500: 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74  _handler(int Not
b510: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
b520: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
b530: 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72  d);.  seenInterr
b540: 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65  upt++;.  if( see
b550: 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65  nInterrupt>2 ) e
b560: 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c  xit(1);.  if( gl
b570: 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33  obalDb ) sqlite3
b580: 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61  _interrupt(globa
b590: 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65  lDb);.}..#if (de
b5a0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
b5b0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
b5c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49   && !defined(_WI
b5d0: 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54  N32_WCE)./*.** T
b5e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
b5f0: 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65   for console eve
b600: 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43  nts (e.g. Ctrl-C
b610: 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74  ) on Win32.*/.st
b620: 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49  atic BOOL WINAPI
b630: 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64   ConsoleCtrlHand
b640: 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43  ler(.  DWORD dwC
b650: 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f  trlType /* One o
b660: 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45  f the CTRL_*_EVE
b670: 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  NT constants */.
b680: 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54  ){.  if( dwCtrlT
b690: 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e  ype==CTRL_C_EVEN
b6a0: 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75  T ){.    interru
b6b0: 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20  pt_handler(0);. 
b6c0: 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
b6d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c    }.  return FAL
b6e0: 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  SE;.}.#endif..#i
b6f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b700: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
b710: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22  /*.** When the "
b720: 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74  .auth ON" is set
b730: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
b740: 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62  authorizer callb
b750: 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  ack is.** invoke
b760: 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  d.  It always re
b770: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b790: 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64  hellAuth(.  void
b7a0: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20   *pClientData,. 
b7b0: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
b7c0: 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f   char *zA1,.  co
b7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20  nst char *zA2,. 
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33   const char *zA3
b7f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b800: 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  zA4.){.  ShellSt
b810: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
b820: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
b830: 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  a;.  static cons
b840: 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e  t char *azAction
b850: 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22  [] = { 0,.     "
b860: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20  CREATE_INDEX",  
b870: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54         "CREATE_T
b880: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22  ABLE",         "
b890: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
b8a0: 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45  X",.     "CREATE
b8b0: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20  _TEMP_TABLE",   
b8c0: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52   "CREATE_TEMP_TR
b8d0: 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45  IGGER",  "CREATE
b8e0: 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20  _TEMP_VIEW",.   
b8f0: 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45    "CREATE_TRIGGE
b900: 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54  R",       "CREAT
b910: 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  E_VIEW",        
b920: 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20    "DELETE",.    
b930: 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20   "DROP_INDEX",  
b940: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54           "DROP_T
b950: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b960: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45   "DROP_TEMP_INDE
b970: 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  X",.     "DROP_T
b980: 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  EMP_TABLE",     
b990: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47   "DROP_TEMP_TRIG
b9a0: 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54  GER",    "DROP_T
b9b0: 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20  EMP_VIEW",.     
b9c0: 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20  "DROP_TRIGGER", 
b9d0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49          "DROP_VI
b9e0: 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EW",            
b9f0: 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22  "INSERT",.     "
ba00: 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20  PRAGMA",        
ba10: 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20         "READ",  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba30: 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54  SELECT",.     "T
ba40: 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20  RANSACTION",    
ba50: 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20        "UPDATE", 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
ba70: 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45  TTACH",.     "DE
ba80: 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  TACH",          
ba90: 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c       "ALTER_TABL
baa0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45  E",          "RE
bab0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e  INDEX",.     "AN
bac0: 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20  ALYZE",         
bad0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41       "CREATE_VTA
bae0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52  BLE",        "DR
baf0: 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20  OP_VTABLE",.    
bb00: 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20   "FUNCTION",    
bb10: 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f           "SAVEPO
bb20: 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  INT",           
bb30: 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d   "RECURSIVE".  }
bb40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
bb50: 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a  st char *az[4];.
bb60: 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20    az[0] = zA1;. 
bb70: 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20   az[1] = zA2;.  
bb80: 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61  az[2] = zA3;.  a
bb90: 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74  z[3] = zA4;.  ut
bba0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bbb0: 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25  , "authorizer: %
bbc0: 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d  s", azAction[op]
bbd0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
bbe0: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77  4; i++){.    raw
bbf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
bc00: 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  " ");.    if( az
bc10: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74  [i] ){.      out
bc20: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
bc30: 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  out, az[i]);.   
bc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
bc50: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bc60: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
bc70: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
bc80: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
bc90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bca0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
bcb0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65  .** Print a sche
bcc0: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50  ma statement.  P
bcd0: 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69  art of MODE_Semi
bce0: 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79   and MODE_Pretty
bcf0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54   output..**.** T
bd00: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
bd10: 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45  erts some CREATE
bd20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
bd30: 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62  s for shadow tab
bd40: 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34  les.** in FTS3/4
bd50: 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54  /5 into CREATE T
bd60: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
bd70: 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  TS statements..*
bd80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
bd90: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49  intSchemaLine(FI
bda0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
bdb0: 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68  har *z, const ch
bdc0: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66  ar *zTail){.  if
bdd0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
bde0: 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b("CREATE TABLE 
bdf0: 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29  ['\"]*", z)==0 )
be00: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
be10: 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54  f(out, "CREATE T
be20: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
be30: 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20  TS %s%s", z+13, 
be40: 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTail);.  }else{
be50: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
be60: 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c  (out, "%s%s", z,
be70: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73   zTail);.  }.}.s
be80: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
be90: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45  SchemaLineN(FILE
bea0: 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20   *out, char *z, 
beb0: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61  int n, const cha
bec0: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61  r *zTail){.  cha
bed0: 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b  r c = z[n];.  z[
bee0: 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53  n] = 0;.  printS
bef0: 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a  chemaLine(out, z
bf00: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d  , zTail);.  z[n]
bf10: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = c;.}../*.** R
bf20: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74  eturn true if st
bf30: 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74  ring z[] has not
bf40: 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70  hing but whitesp
bf50: 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ace and comments
bf60: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
bf70: 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  f the first line
bf80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf90: 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68  wsToEol(const ch
bfa0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
bfb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
bfc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bfd0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74  z[i]=='\n' ) ret
bfe0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49  urn 1;.    if( I
bff0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63  sSpace(z[i]) ) c
c000: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
c010: 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[i]=='-' && z[
c020: 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75  i+1]=='-' ) retu
c030: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
c040: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c050: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
c060: 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
c070: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
c080: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
c090: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 61  tatic void eqp_a
c0a0: 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  ppend(ShellState
c0b0: 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 2c   *p, int iEqpId,
c0c0: 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63   int p2, const c
c0d0: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 45  har *zText){.  E
c0e0: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 77  QPGraphRow *pNew
c0f0: 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20  ;.  int nText = 
c100: 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29 3b  strlen30(zText);
c110: 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51  .  if( p->autoEQ
c120: 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74 66  Ptest ){.    utf
c130: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c140: 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20 69   "%d,%d,%s\n", i
c150: 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78 74  EqpId, p2, zText
c160: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  );.  }.  pNew = 
c170: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
c180: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
c190: 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66 28  + nText );.  if(
c1a0: 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c 6c   pNew==0 ) shell
c1b0: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
c1c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49 64  ;.  pNew->iEqpId
c1d0: 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e 65   = iEqpId;.  pNe
c1e0: 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20 70  w->iParentId = p
c1f0: 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  2;.  memcpy(pNew
c200: 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20  ->zText, zText, 
c210: 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77  nText+1);.  pNew
c220: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
c230: 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  f( p->sGraph.pLa
c240: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72  st ){.    p->sGr
c250: 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74  aph.pLast->pNext
c260: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65   = pNew;.  }else
c270: 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  {.    p->sGraph.
c280: 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pRow = pNew;.  }
c290: 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  .  p->sGraph.pLa
c2a0: 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  st = pNew;.}../*
c2b0: 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73  .** Free and res
c2c0: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
c2d0: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74  UERY PLAN data t
c2e0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c  hat has been col
c2f0: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  lected.** in p->
c300: 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69  sGraph..*/.stati
c310: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74  c void eqp_reset
c320: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c330: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c340: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c350: 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47  for(pRow = p->sG
c360: 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b  raph.pRow; pRow;
c370: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c380: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77      pNext = pRow
c390: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
c3a0: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
c3b0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
c3c0: 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a  ->sGraph, 0, siz
c3d0: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b  eof(p->sGraph));
c3e0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
c3f0: 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51  e next EXPLAIN Q
c400: 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77  UERY PLAN line w
c410: 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74 20  ith iEqpId that 
c420: 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a 20  occurs after.** 
c430: 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e 20  pOld, or return 
c440: 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20 6c  the first such l
c450: 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20 4e  ine if pOld is N
c460: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45 51  ULL.*/.static EQ
c470: 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f 6e  PGraphRow *eqp_n
c480: 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74 61  ext_row(ShellSta
c490: 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49  te *p, int iEqpI
c4a0: 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  d, EQPGraphRow *
c4b0: 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61 70  pOld){.  EQPGrap
c4c0: 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f 6c  hRow *pRow = pOl
c4d0: 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74 20  d ? pOld->pNext 
c4e0: 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77  : p->sGraph.pRow
c4f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77 20  ;.  while( pRow 
c500: 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e 74  && pRow->iParent
c510: 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52 6f  Id!=iEqpId ) pRo
c520: 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b  w = pRow->pNext;
c530: 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b 0a  .  return pRow;.
c540: 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20 73  }../* Render a s
c550: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74  ingle level of t
c560: 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68 61  he graph that ha
c570: 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73 20  s iEqpId as its 
c580: 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64 0a  parent.  Called.
c590: 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ** recursively t
c5a0: 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76 65  o render subleve
c5b0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
c5c0: 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65  id eqp_render_le
c5d0: 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  vel(ShellState *
c5e0: 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b 0a  p, int iEqpId){.
c5f0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c600: 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Row, *pNext;.  i
c610: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
c620: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c630: 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  x);.  char *z;. 
c640: 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70 5f   for(pRow = eqp_
c650: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c660: 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70 52  Id, 0); pRow; pR
c670: 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20  ow = pNext){.   
c680: 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65 78   pNext = eqp_nex
c690: 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c  t_row(p, iEqpId,
c6a0: 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20   pRow);.    z = 
c6b0: 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20 20  pRow->zText;.   
c6c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c6d0: 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22 2c  out, "%s%s%s\n",
c6e0: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c6f0: 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d 2d  ix, pNext ? "|--
c700: 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a 20  " : "`--", z);. 
c710: 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73 69     if( n<(int)si
c720: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a  zeof(p->sGraph.z
c730: 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20 20  Prefix)-7 ){.   
c740: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47     memcpy(&p->sG
c750: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 2c  raph.zPrefix[n],
c760: 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20 3a   pNext ? "|  " :
c770: 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20 20   "   ", 4);.    
c780: 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76    eqp_render_lev
c790: 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71 70  el(p, pRow->iEqp
c7a0: 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  Id);.      p->sG
c7b0: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 20  raph.zPrefix[n] 
c7c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c7d0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
c7e0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58  and reset the EX
c7f0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
c800: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
c810: 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 28  void eqp_render(
c820: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
c830: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c840: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
c850: 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f 77  pRow;.  if( pRow
c860: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 77   ){.    if( pRow
c870: 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27 20  ->zText[0]=='-' 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 6f  ){.      if( pRo
c890: 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  w->pNext==0 ){. 
c8a0: 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65 74         eqp_reset
c8b0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
c8c0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c8d0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c8e0: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 70  ->out, "%s\n", p
c8f0: 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a 20  Row->zText+3);. 
c900: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70       p->sGraph.p
c910: 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78  Row = pRow->pNex
c920: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
c930: 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 20  _free(pRow);.   
c940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
c950: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c960: 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22  , "QUERY PLAN\n"
c970: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
c980: 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 30  sGraph.zPrefix[0
c990: 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f 72  ] = 0;.    eqp_r
c9a0: 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 30  ender_level(p, 0
c9b0: 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65 74  );.    eqp_reset
c9c0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
c9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9e0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
c9f0: 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73 73  K./*.** Progress
ca00: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
ca10: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ca20: 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65   progress_handle
ca30: 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44  r(void *pClientD
ca40: 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53 74  ata) {.  ShellSt
ca50: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
ca60: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
ca70: 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73  a;.  p->nProgres
ca80: 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 50  s++;.  if( p->nP
ca90: 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50 72  rogress>=p->mxPr
caa0: 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78 50  ogress && p->mxP
cab0: 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20 20  rogress>0 ){.   
cac0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
cad0: 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c 69  ut, "Progress li
cae0: 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75 29  mit reached (%u)
caf0: 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73  \n", p->nProgres
cb00: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66  s);.    if( p->f
cb10: 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45  lgProgress & SHE
cb20: 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53 45  LL_PROGRESS_RESE
cb30: 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  T ) p->nProgress
cb40: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
cb50: 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53  >flgProgress & S
cb60: 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f 4e  HELL_PROGRESS_ON
cb70: 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72 65  CE ) p->mxProgre
cb80: 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ss = 0;.    retu
cb90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
cba0: 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20  (p->flgProgress 
cbb0: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cbc0: 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20 20  _QUIET)==0 ){.  
cbd0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cbe0: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 25  out, "Progress %
cbf0: 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  u\n", p->nProgre
cc00: 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ss);.  }.  retur
cc10: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
cc20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
cc30: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20 2a  GRESS_CALLBACK *
cc40: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
cc50: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
cc60: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73  utine that the s
cc70: 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  hell.** invokes 
cc80: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
cc90: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
cca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
ccb0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  ell_callback(.  
ccc0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
ccd0: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f  t nArg,        /
cce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
ccf0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
cd00: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
cd10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
cd20: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
cd30: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
cd40: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
cd50: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ames */.  int *a
cd60: 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f  iType      /* Co
cd70: 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b  lumn types */.){
cd80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c  .  int i;.  Shel
cd90: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
cda0: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a  llState*)pArg;..
cdb0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
cdc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
cdd0: 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b  tch( p->cMode ){
cde0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
cdf0: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
ce00: 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66   w = 5;.      if
ce10: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
ce20: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
ce30: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ce40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
ce50: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f   = strlen30(azCo
ce60: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
ce70: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69  : "");.        i
ce80: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
ce90: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
cea0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
ceb0: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
cec0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
ced0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
cee0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cef0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cf00: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cf10: 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73  p->out,"%*s = %s
cf20: 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  %s", w, azCol[i]
cf30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf40: 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41    azArg[i] ? azA
cf50: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
cf60: 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61  alue, p->rowSepa
cf70: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
cf80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf90: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
cfa0: 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61  _Explain:.    ca
cfb0: 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20  se MODE_Column: 
cfc0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
cfd0: 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69  onst int aExplai
cfe0: 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20  nWidths[] = {4, 
cff0: 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c  13, 4, 4, 4, 13,
d000: 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63   2, 13};.      c
d010: 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64  onst int *colWid
d020: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68  th;.      int sh
d030: 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61  owHdr;.      cha
d040: 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20  r *rowSep;.     
d050: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
d060: 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  ODE_Column ){.  
d070: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
d080: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20   p->colWidth;.  
d090: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
d0a0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
d0b0: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
d0c0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b  p->rowSeparator;
d0d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d0e0: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
d0f0: 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b   aExplainWidths;
d100: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
d110: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f   = 1;.        ro
d120: 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a  wSep = SEP_Row;.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d140: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b  ( p->cnt++==0 ){
d150: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
d160: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d170: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c            int w,
d180: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   n;.          if
d190: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
d1a0: 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  >colWidth) ){.  
d1b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f            w = co
d1c0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
d1d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d1e0: 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20          w = 0;. 
d1f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d200: 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b       if( w==0 ){
d210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d220: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f   strlenChar(azCo
d230: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
d240: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
d250: 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20     if( w<10 ) w 
d260: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
d270: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    n = strlenChar
d280: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
d290: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
d2a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
d2c0: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
d2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d2e0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d2f0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d310: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
d320: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
d330: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
d340: 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20  ( showHdr ){.   
d350: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69           utf8_wi
d360: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
d370: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  , w, azCol[i]);.
d380: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d390: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d3a0: 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  "%s", i==nArg-1 
d3b0: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d3e0: 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20  if( showHdr ){. 
d3f0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
d400: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d410: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d420: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  w;.            i
d430: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d440: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
d450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d460: 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69   w = p->actualWi
d470: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
d480: 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29         if( w<0 )
d490: 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20   w = -w;.       
d4a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d4b0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
d4c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d4e0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d4f0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a  "%-*.*s%s",w,w,.
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a  --------------".
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c  --------------",
d5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5b0: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
d5c0: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
d5d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d5f0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
d600: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
d610: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d630: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69  int w;.        i
d640: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d650: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
d660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
d670: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
d680: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
d690: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  e{.           w 
d6a0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
d6b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63          if( p->c
d6c0: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  Mode==MODE_Expla
d6d0: 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26  in && azArg[i] &
d6e0: 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  & strlenChar(azA
d6f0: 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20  rg[i])>w ){.    
d700: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
d710: 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  Char(azArg[i]);.
d720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d730: 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d    if( i==1 && p-
d740: 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e  >aiIndent && p->
d750: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
d760: 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e     if( p->iInden
d770: 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a  t<p->nIndent ){.
d780: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d790: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d7a0: 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64  "%*.s", p->aiInd
d7b0: 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c  ent[p->iIndent],
d7c0: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
d7d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  }.          p->i
d7e0: 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  Indent++;.      
d7f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
d800: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
d810: 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d  out, w, azArg[i]
d820: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
d830: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
d840: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d850: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
d860: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
d870: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
d880: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d890: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d8a0: 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a  ODE_Semi: {   /*
d8b0: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
d8c0: 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20  llschema output 
d8d0: 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63  */.      printSc
d8e0: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
d8f0: 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22   azArg[0], ";\n"
d900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d910: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d920: 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f  ODE_Pretty: {  /
d930: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d940: 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d  ullschema with -
d950: 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20  -indent */.     
d960: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
d970: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  int j;.      int
d980: 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20   nParen = 0;.   
d990: 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30     char cEnd = 0
d9a0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
d9b0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20        int nLine 
d9c0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
d9d0: 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
d9e0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d      if( azArg[0]
d9f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
da00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
da10: 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56  trlike("CREATE V
da20: 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c  IEW%", azArg[0],
da30: 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c   0)==0.       ||
da40: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
da50: 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c  ("CREATE TRIG%",
da60: 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30   azArg[0], 0)==0
da70: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
da80: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
da90: 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61  >out, "%s;\n", a
daa0: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
dab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
dac0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
dad0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
dae0: 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
daf0: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66    j = 0;.      f
db00: 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28  or(i=0; IsSpace(
db10: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
db20: 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a      for(; (c = z
db30: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
db40: 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61         if( IsSpa
db50: 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  ce(c) ){.       
db60: 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27     if( z[j-1]=='
db70: 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27  \r' ) z[j-1] = '
db80: 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  \n';.          i
db90: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31  f( IsSpace(z[j-1
dba0: 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28  ]) || z[j-1]=='(
dbb0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
dbc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbd0: 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29  (c=='(' || c==')
dbe0: 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53  ') && j>0 && IsS
dbf0: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a  pace(z[j-1]) ){.
dc00: 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20            j--;. 
dc10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc20: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20   z[j++] = c;.   
dc30: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
dc40: 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  ( j>0 && IsSpace
dc50: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b  (z[j-1]) ){ j--;
dc60: 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20   }.      z[j] = 
dc70: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  0;.      if( str
dc80: 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a  len30(z)>=79 ){.
dc90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d          for(i=j=
dca0: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
dcb0: 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79  ; i++){  /* Copy
dcc0: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b   changes from z[
dcd0: 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20  i] back to z[j] 
dce0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
dcf0: 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20   c==cEnd ){.    
dd00: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30          cEnd = 0
dd10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dd20: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
dd30: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
dd40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
dd50: 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20   cEnd = c;.     
dd60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
dd70: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
dd80: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b       cEnd = ']';
dd90: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
dda0: 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a   if( c=='-' && z
ddb0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  [i+1]=='-' ){.  
ddc0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
ddd0: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
dde0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28   }else if( c=='(
ddf0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
de00: 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20   nParen++;.     
de10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
de20: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
de30: 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20       nParen--;. 
de40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
de50: 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e  Line>0 && nParen
de60: 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20  ==0 && j>0 ){.  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
de80: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
de90: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29  out, z, j, "\n")
dea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
deb0: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
dec0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
ded0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
dee0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
def0: 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26   if( nParen==1 &
df00: 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20  & cEnd==0.      
df10: 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20       && (c=='(' 
df20: 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63  || c=='\n' || (c
df30: 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f  ==',' && !wsToEo
df40: 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20  l(z+i+1))).     
df50: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
df60: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
df70: 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ) j--;.         
df80: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
df90: 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a  neN(p->out, z, j
dfa0: 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20  , "\n  ");.     
dfb0: 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20         j = 0;.  
dfc0: 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b            nLine+
dfd0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  +;.            w
dfe0: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b  hile( IsSpace(z[
dff0: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
e000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
e020: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  j] = 0;.      }.
e030: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
e040: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c  aLine(p->out, z,
e050: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73   ";\n");.      s
e060: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
e070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e080: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e090: 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69  _List: {.      i
e0a0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
e0b0: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
e0c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
e0d0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e0f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e100: 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a  %s%s",azCol[i],.
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d    i==nArg-1 ? p-
e130: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20  >rowSeparator : 
e140: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e160: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e170: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e180: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e190: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e1a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
e1b0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
e1c0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
e1d0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20  p->nullValue;.  
e1e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e1f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e200: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
e210: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
e220: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e230: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e240: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e250: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e260: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e270: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e280: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e290: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e2b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e2c0: 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20  case MODE_Html: 
e2d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e2e0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e2f0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e300: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e310: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
e320: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e330: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e340: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e350: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22  tf(p->out,"<TH>"
e360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
e370: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
e380: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
e390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
e3a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3b0: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
e3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
e3d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3e0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e3f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e400: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e410: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e420: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e430: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e440: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e450: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e460: 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a  p->out,"<TD>");.
e470: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e480: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
e490: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
e4a0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
e4b0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e4c0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e4d0: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
e4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
e4f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
e500: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
e510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e520: 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20   case MODE_Tcl: 
e530: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e540: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e550: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e560: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e570: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e580: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
e590: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f  ring(p->out,azCo
e5a0: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
e5b0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
e5c0: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
e5d0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e5e0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
e5f0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e600: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e610: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e620: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e630: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e640: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
e650: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e670: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e680: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
e690: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
e6a0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
e6b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
e6c0: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
e6d0: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
e6e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e6f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
e700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
e710: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e720: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e730: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
e740: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e750: 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b  case MODE_Csv: {
e760: 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79  .      setBinary
e770: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
e780: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
e790: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
e7a0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
e7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e7c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e7d0: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
e7e0: 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  , azCol[i] ? azC
e7f0: 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41  ol[i] : "", i<nA
e800: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
e810: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e820: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e830: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e840: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
e850: 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b     if( nArg>0 ){
e860: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
e870: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e880: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e890: 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d  _csv(p, azArg[i]
e8a0: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
e8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
e8c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e8d0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
e8e0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e8f0: 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74   }.      setText
e900: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
e910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e920: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e930: 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20  E_Insert: {.    
e940: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
e950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74   break;.      ut
e960: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e970: 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73  ,"INSERT INTO %s
e980: 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  ",p->zDestTable)
e990: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  ;.      if( p->s
e9a0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e9b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e9c0: 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20  p->out,"(");.   
e9d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e9e0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e9f0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ea00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ea10: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
ea20: 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72     if( quoteChar
ea30: 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  (azCol[i]) ){.  
ea40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
ea50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
ea60: 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a  ntf("\"%w\"", az
ea70: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
ea80: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ea90: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
eaa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
eab0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
eac0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ead0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
eae0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
eaf0: 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  "%s", azCol[i]);
eb00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
eb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
eb20: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
eb30: 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,")");.      }. 
eb40: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
eb50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
eb60: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
eb70: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
eb80: 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22  ->out, i>0 ? ","
eb90: 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a   : " VALUES(");.
eba0: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
ebb0: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
ebc0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ebd0: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
ebe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ebf0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ec00: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
ec10: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
ec20: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
ec30: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
ec40: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65           if( She
ec50: 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
ec60: 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a  LG_Newlines) ){.
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
ec80: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
ec90: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
eca0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]);.          }e
ecb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ecc0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
ecd0: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d  scaped_string(p-
ece0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
ecf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ed00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ed10: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ed20: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
ed30: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
ed40: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ed50: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ed60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ed70: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ed80: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ed90: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
eda0: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
edb0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
edc0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
edd0: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
ede0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
edf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
ee00: 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20 20  64 ur;.         
ee10: 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c 73   memcpy(&ur,&r,s
ee20: 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20  izeof(r));.     
ee30: 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37       if( ur==0x7
ee40: 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c  ff0000000000000L
ee50: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
ee60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ee70: 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20 20  ut, "1e999");.  
ee80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ee90: 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30 30  ( ur==0xfff00000
eea0: 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20  00000000LL ){.  
eeb0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
eec0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31  intf(p->out, "-1
eed0: 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20  e999");.        
eee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
eef0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ef00: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
ef10: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
ef20: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ef30: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
ef40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ef50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ef60: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ef70: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
ef80: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
ef90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
efa0: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
efb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
efc0: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
efd0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
efe0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
eff0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
f000: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
f010: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
f020: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
f030: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
f040: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
f050: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
f060: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
f070: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f080: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
f090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f0a0: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
f0b0: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
f0c0: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
f0d0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
f0e0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
f0f0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
f100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f110: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f120: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
f130: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f150: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
f160: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
f170: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
f180: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f190: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a  e MODE_Quote: {.
f1a0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
f1b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f1c0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20    if( p->cnt==0 
f1d0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
f1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
f1f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f210: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
f220: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
f230: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
f240: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
f250: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
f260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f270: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f280: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
f290: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e     }.      p->cn
f2a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t++;.      for(i
f2b0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f2c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
f2d0: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
f2e0: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
f2f0: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
f300: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
f310: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f320: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
f330: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f340: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
f350: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
f360: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f370: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f380: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
f390: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
f3a0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
f3b0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
f3c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f3d0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
f3e0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
f3f0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
f400: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f410: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
f420: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f430: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
f440: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
f450: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
f460: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
f470: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
f480: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
f490: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
f4a0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f4c0: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
f4d0: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
f4e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f4f0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
f500: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f510: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f520: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
f530: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
f540: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
f550: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
f560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f570: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
f580: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
f590: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
f5a0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
f5b0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f5c0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
f5d0: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
f5e0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
f5f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
f600: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
f610: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
f620: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f630: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
f640: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f650: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
f660: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
f670: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
f680: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
f690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
f6a0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f6b0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
f6c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f6d0: 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b  se MODE_Ascii: {
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
f6f0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
f700: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
f710: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
f720: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
f730: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
f740: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f750: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
f760: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
f770: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f780: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f  p->out,"%s",azCo
f790: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
f7a0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  : "");.        }
f7b0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
f7c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7d0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
f7e0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
f7f0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
f800: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
f810: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f820: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
f830: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
f840: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f850: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
f860: 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  r);.        utf8
f870: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f880: 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61  %s",azArg[i] ? a
f890: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
f8a0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  lValue);.      }
f8b0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
f8c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f8d0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
f8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
f900: 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20  ODE_EQP: {.     
f910: 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61   eqp_append(p, a
f920: 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61  toi(azArg[0]), a
f930: 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61  toi(azArg[1]), a
f940: 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20  zArg[3]);.      
f950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f960: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
f980: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
f990: 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69  ne that the SQLi
f9a0: 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e  te library.** in
f9b0: 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72  vokes for each r
f9c0: 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65  ow of a query re
f9d0: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
f9e0: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69  int callback(voi
f9f0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
fa00: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
fa10: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a   char **azCol){.
fa20: 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f    /* since we do
fa30: 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e  n't have type in
fa40: 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65  fo, call the she
fa50: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ll_callback with
fa60: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f   a NULL value */
fa70: 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f  .  return shell_
fa80: 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  callback(pArg, n
fa90: 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f  Arg, azArg, azCo
faa0: 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  l, NULL);.}../*.
fab0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
fac0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
fad0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65  from sqlite3_exe
fae0: 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73  c() that appends
faf0: 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f   all.** output o
fb00: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61  nto the end of a
fb10: 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63   ShellText objec
fb20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
fb30: 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61   captureOutputCa
fb40: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
fb50: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
fb60: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
fb70: 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65  **az){.  ShellTe
fb80: 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65  xt *p = (ShellTe
fb90: 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20  xt*)pArg;.  int 
fba0: 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
fbb0: 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28  METER(az);.  if(
fbc0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
fbd0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  rn 0;.  if( p->n
fbe0: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
fbf0: 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28   "|", 0);.  for(
fc00: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
fc10: 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61  ){.    if( i ) a
fc20: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22  ppendText(p, ","
fc30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
fc40: 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54  Arg[i] ) appendT
fc50: 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  ext(p, azArg[i],
fc60: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
fc70: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
fc80: 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70  nerate an approp
fc90: 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74  riate SELFTEST t
fca0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
fcb0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
fcc0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
fcd0: 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68  SelftestTable(Sh
fce0: 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
fcf0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
fd00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  0;.  sqlite3_exe
fd10: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41  c(p->db,.    "SA
fd20: 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74  VEPOINT selftest
fd30: 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43  _init;\n".    "C
fd40: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
fd50: 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65  OT EXISTS selfte
fd60: 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e  st(\n".    "  tn
fd70: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
fd80: 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54  Y KEY,\n"   /* T
fd90: 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  est number */.  
fda0: 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22    "  op TEXT,\n"
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20     /* Operator: 
fdd0: 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20   memo run */.   
fde0: 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22   "  cmd TEXT,\n"
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78    /* Command tex
fe10: 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20  t */.    "  ans 
fe20: 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20  TEXT\n"         
fe30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
fe40: 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20  ired answer */. 
fe50: 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45     ");".    "CRE
fe60: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b  ATE TEMP TABLE [
fe70: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c  _shell$self](op,
fe80: 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20  cmd,ans);\n".   
fe90: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
fea0: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69  shell$self](rowi
feb0: 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20  d,op,cmd)\n".   
fec0: 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65   "  VALUES(coale
fed0: 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78  sce((SELECT (max
fee0: 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52  (tno)+100)/10 FR
fef0: 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29  OM selftest),10)
ff00: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  ,\n".    "      
ff10: 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73     'memo','Tests
ff20: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d   generated by --
ff30: 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22  init');\n".    "
ff40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
ff50: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
ff60: 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
ff70: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53  ,\n".    "    'S
ff80: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
ff90: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79  uery(''SELECT ty
ffa0: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
ffb0: 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
ffe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
fff0: 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c  R BY 2'',224))',
10000 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78  \n".    "    hex
10010 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c  (sha3_query('SEL
10020 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
10030 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20  l_name,sql ".   
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
10060 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
10070 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22   BY 2',224));\n"
10080 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
10090 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
100a0 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  n".    "  SELECT
100b0 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20   'run',".    "  
100c0 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68    'SELECT hex(sh
100d0 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43  a3_query(''SELEC
100e0 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22  T * FROM \"' ||"
100f0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72  .    "        pr
10100 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20  intf('%w',name) 
10110 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58  || '\" NOT INDEX
10120 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a  ED'',224))',\n".
10130 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
10140 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27  3_query(printf('
10150 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
10160 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44  %w\" NOT INDEXED
10170 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22  ',name),224))\n"
10180 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e  .    "  FROM (\n
10190 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
101a0 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
101b0 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
101c0 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70   "     WHERE typ
101d0 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20  e='table'\n".   
101e0 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d   "       AND nam
101f0 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22  e<>'selftest'\n"
10200 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44  .    "       AND
10210 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
10220 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22  ge,0)>0\n".    "
10230 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44    )\n".    " ORD
10240 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20  ER BY name;\n". 
10250 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
10260 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22  [_shell$self]\n"
10270 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27  .    "  VALUES('
10280 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74  run','PRAGMA int
10290 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f  egrity_check','o
102a0 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  k');\n".    "INS
102b0 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73  ERT INTO selftes
102c0 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73  t(tno,op,cmd,ans
102d0 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  )".    "  SELECT
102e0 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64   rowid*10,op,cmd
102f0 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c  ,ans FROM [_shel
10300 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20  l$self];\n".    
10310 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68  "DROP TABLE [_sh
10320 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20  ell$self];".    
10330 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a  ,0,0,&zErrMsg);.
10340 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
10350 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10360 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45  (stderr, "SELFTE
10370 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ST initializatio
10380 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22  n failure: %s\n"
10390 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
103a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
103b0 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rMsg);.  }.  sql
103c0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
103d0 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65   "RELEASE selfte
103e0 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b  st_init",0,0,0);
103f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
10400 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
10410 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68  able field of th
10420 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72  e ShellState str
10430 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65  ucture to.** the
10440 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10450 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70  le given.  Escap
10460 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72  e any quote char
10470 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  acters in the.**
10480 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a   table name..*/.
10490 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f  static void set_
104a0 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c  table_name(Shell
104b0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
104c0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
104d0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72  int i, n;.  char
104e0 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20   cQuote;.  char 
104f0 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44  *z;..  if( p->zD
10500 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  estTable ){.    
10510 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62  free(p->zDestTab
10520 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  le);.    p->zDes
10530 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  tTable = 0;.  }.
10540 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
10550 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74   return;.  cQuot
10560 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e  e = quoteChar(zN
10570 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c  ame);.  n = strl
10580 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
10590 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d  f( cQuote ) n +=
105a0 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a   n+2;.  z = p->z
105b0 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
105c0 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
105d0 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75   z==0 ) shell_ou
105e0 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
105f0 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51   n = 0;.  if( cQ
10600 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
10610 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d  cQuote;.  for(i=
10620 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b  0; zName[i]; i++
10630 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20  ){.    z[n++] = 
10640 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66  zName[i];.    if
10650 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f  ( zName[i]==cQuo
10660 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
10670 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uote;.  }.  if( 
10680 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
10690 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d  = cQuote;.  z[n]
106a0 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
106b0 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
106c0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
106d0 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c  ill generate SQL
106e0 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a   output.  Print.
106f0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
10700 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70  lumns, comma-sep
10710 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e  arated, on a lin
10720 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61  e and then add a
10730 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  .** semicolon te
10740 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20  rminator to the 
10750 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65  end of that line
10760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
10770 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10780 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63   is 1 and that c
10790 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
107a0 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e  ext "--".** then
107b0 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63   write the semic
107c0 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61  olon on a separa
107d0 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77  te line.  That w
107e0 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22  ay, if a.** "--"
107f0 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20   comment occurs 
10800 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10810 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
10820 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27   comment.** won'
10830 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65  t consume the se
10840 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
10850 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
10860 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70  t run_table_dump
10870 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53  _query(.  ShellS
10880 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
10890 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74     /* Query cont
108a0 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
108b0 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20  har *zSelect,   
108c0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
108d0 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74  ement to extract
108e0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f   content */.  co
108f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74  nst char *zFirst
10900 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20  Row    /* Print 
10910 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77  before first row
10920 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
10930 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10940 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69  mt *pSelect;.  i
10950 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
10960 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sult;.  int i;. 
10970 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
10990 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
109a0 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70   zSelect, -1, &p
109b0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
109c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
109d0 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20  || !pSelect ){. 
109e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
109f0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
10a00 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
10a10 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20  **/\n", rc,.    
10a20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10a30 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
10a40 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
10a50 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
10a60 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
10a70 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  +;.    return rc
10a80 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
10a90 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
10aa0 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20  t);.  nResult = 
10ab0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
10ac0 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  ount(pSelect);. 
10ad0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
10ae0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66  TE_ROW ){.    if
10af0 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20  ( zFirstRow ){. 
10b00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
10b10 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
10b20 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20  FirstRow);.     
10b30 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a   zFirstRow = 0;.
10b40 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63      }.    z = (c
10b50 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
10b60 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
10b70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
10b80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10b90 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
10ba0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65    for(i=1; i<nRe
10bb0 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
10bc0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10bd0 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c  >out, ",%s", sql
10be0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
10bf0 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20  (pSelect, i));. 
10c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d     }.    if( z==
10c10 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20  0 ) z = "";.    
10c20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28  while( z[0] && (
10c30 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31  z[0]!='-' || z[1
10c40 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20  ]!='-') ) z++;. 
10c50 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20     if( z[0] ){. 
10c60 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10c70 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29  p->out, "\n;\n")
10c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
10ca0 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  >out, ";\n");.  
10cb0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
10cc0 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
10cd0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
10ce0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
10cf0 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
10d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10d10 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10d20 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
10d30 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
10d40 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10d60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
10d70 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
10d80 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
10d90 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
10da0 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
10db0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10dc0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e  llocate space an
10dd0 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65  d save off curre
10de0 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e  nt error string.
10df0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
10e00 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20  *save_err_msg(. 
10e10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20   sqlite3 *db    
10e20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10e30 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
10e40 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67  ){.  int nErrMsg
10e50 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71   = 1+strlen30(sq
10e60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10e70 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  );.  char *zErrM
10e80 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  sg = sqlite3_mal
10e90 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a  loc64(nErrMsg);.
10ea0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
10eb0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72  .    memcpy(zErr
10ec0 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Msg, sqlite3_err
10ed0 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67  msg(db), nErrMsg
10ee0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10ef0 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64  zErrMsg;.}..#ifd
10f00 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a  ef __linux__./*.
10f10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69  ** Attempt to di
10f20 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20  splay I/O stats 
10f30 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f  on Linux using /
10f40 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73  proc/PID/io.*/.s
10f50 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
10f60 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46  ayLinuxIoStats(F
10f70 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c  ILE *out){.  FIL
10f80 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b  E *in;.  char z[
10f90 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
10fa0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10fb0 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64  z), z, "/proc/%d
10fc0 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b  /io", getpid());
10fd0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c  .  in = fopen(z,
10fe0 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e   "rb");.  if( in
10ff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11000 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20  while( fgets(z, 
11010 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d  sizeof(z), in)!=
11020 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
11030 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
11040 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11050 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20  *zPattern;.     
11060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
11070 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73  sc;.    } aTrans
11080 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
11090 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  rchar: ",       
110a0 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
110b0 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65  s received by re
110c0 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20  ad():" },.      
110d0 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20  { "wchar: ",    
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
110f0 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69  ytes sent to wri
11100 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20  te():"    },.   
11110 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20     { "syscr: ", 
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20   "Read() system 
11140 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a  calls:"      },.
11150 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20        { "syscw: 
11160 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11170 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73      "Write() sys
11180 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20  tem calls:"     
11190 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64  },.      { "read
111a0 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20  _bytes: ",      
111b0 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65         "Bytes re
111c0 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a  ad from storage:
111d0 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77  "  },.      { "w
111e0 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
111f0 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
11200 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72   written to stor
11210 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  age:" },.      {
11220 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74   "cancelled_writ
11230 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61  e_bytes: ",  "Ca
11240 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79  ncelled write by
11250 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  tes:"    },.    
11260 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  };.    int i;.  
11270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
11280 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20  aySize(aTrans); 
11290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
112a0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72  n = strlen30(aTr
112b0 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29  ans[i].zPattern)
112c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
112d0 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  cmp(aTrans[i].zP
112e0 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  attern, z, n)==0
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
11300 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11310 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b  36s %s", aTrans[
11320 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29  i].zDesc, &z[n])
11330 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
11340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11350 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
11360 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
11370 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c   Display a singl
11380 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73  e line of status
11390 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61   using 64-bit va
113a0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
113b0 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74  void displayStat
113c0 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61  Line(.  ShellSta
113d0 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
113e0 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63    /* The shell c
113f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72  ontext */.  char
11400 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20   *zLabel,       
11410 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
11420 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65  or this one line
11430 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72   */.  char *zFor
11440 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
11450 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68  /* Format for th
11460 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e  e result */.  in
11470 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20  t iStatusCtrl,  
11480 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
11490 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c   status to displ
114a0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  ay */.  int bRes
114b0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
114c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
114d0 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
114e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
114f0 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20  64 iCur = -1;.  
11500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48  sqlite3_int64 iH
11510 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  iwtr = -1;.  int
11520 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20   i, nPercent;.  
11530 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b  char zLine[200];
11540 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
11550 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c  s64(iStatusCtrl,
11560 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11570 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28   bReset);.  for(
11580 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b  i=0, nPercent=0;
11590 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b   zFormat[i]; i++
115a0 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d  ){.    if( zForm
115b0 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65  at[i]=='%' ) nPe
115c0 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rcent++;.  }.  i
115d0 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b  f( nPercent>1 ){
115e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
115f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
11600 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72  ne), zLine, zFor
11610 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74  mat, iCur, iHiwt
11620 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
11630 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11640 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
11650 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
11660 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20   iHiwtr);.  }.  
11670 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
11680 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11690 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b   zLabel, zLine);
116a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
116b0 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a  y memory stats..
116c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
116d0 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73  splay_stats(.  s
116e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
116f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
11700 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
11710 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
11720 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
11730 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
11740 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69  hellState */.  i
11750 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
11760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11770 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
11780 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  stats */.){.  in
11790 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48  t iCur;.  int iH
117a0 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75  iwtr;.  FILE *ou
117b0 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30  t;.  if( pArg==0
117c0 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30   || pArg->out==0
117d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f   ) return 0;.  o
117e0 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a  ut = pArg->out;.
117f0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
11800 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61  mt && (pArg->sta
11810 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20  tsOn & 2) ){.   
11820 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b   int nCol, i, x;
11830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
11840 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d  t *pStmt = pArg-
11850 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  >pStmt;.    char
11860 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f   z[100];.    nCo
11870 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
11880 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
11890 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
118a0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e  out, "%-36s %d\n
118b0 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75  ", "Number of ou
118c0 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20  tput columns:", 
118d0 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  nCol);.    for(i
118e0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
118f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11900 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
11910 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20  z),z,"Column %d 
11920 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29  %nname:", i, &x)
11930 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11940 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11950 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11960 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
11970 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66  tmt,i));.#ifndef
11980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
11990 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69  LTYPE.      sqli
119a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
119b0 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20   z+x, "declared 
119c0 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  type:");.      u
119d0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
119e0 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
119f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11a00 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20  decltype(pStmt, 
11a10 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i));.#endif.#ifd
11a20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11a30 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
11a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11a50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11a60 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a   "database name:
11a70 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11a80 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11a90 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
11ab0 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ase_name(pStmt,i
11ac0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11ad0 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11ae0 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a  +x, "table name:
11af0 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11b00 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11b10 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11b20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
11b30 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11b50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11b60 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29   "origin name:")
11b70 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11b80 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11b90 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11ba0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
11bb0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11bc0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
11bd0 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ..  displayStatL
11be0 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
11bf0 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22  y Used:",.     "
11c00 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
11c10 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11c20 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
11c30 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  D, bReset);.  di
11c40 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11c50 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  rg, "Number of O
11c60 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
11c70 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22  ations:",.     "
11c80 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
11c90 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11ca0 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52  MALLOC_COUNT, bR
11cb0 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72  eset);.  if( pAr
11cc0 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
11cd0 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
11ce0 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  {.    displaySta
11cf0 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11d00 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61  ber of Pcache Pa
11d10 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20  ges Used:",.    
11d20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11d30 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49  ld) pages", SQLI
11d40 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11d50 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74  CHE_USED, bReset
11d60 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79  );.  }.  display
11d70 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11d80 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11d90 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
11da0 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11db0 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
11dc0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11dd0 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f  AGECACHE_OVERFLO
11de0 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  W, bReset);.  di
11df0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11e00 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c  rg, "Largest All
11e10 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11e20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11e30 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
11e40 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  OC_SIZE, bReset)
11e50 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ;.  displayStatL
11e60 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65  ine(pArg, "Large
11e70 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
11e80 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
11e90 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
11ea0 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11eb0 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  HE_SIZE, bReset)
11ec0 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b  ;.#ifdef YYTRACK
11ed0 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20  MAXSTACKDEPTH.  
11ee0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11ef0 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50  pArg, "Deepest P
11f00 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20  arser Stack:",. 
11f10 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11f20 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
11f30 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43  ATUS_PARSER_STAC
11f40 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64  K, bReset);.#end
11f50 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  if..  if( db ){.
11f60 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
11f70 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11f80 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20  Lookaside ){.   
11f90 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
11fa0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
11fb0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
11fc0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
11fd0 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
11fe0 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
11ff0 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
12000 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
12010 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
12020 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
12040 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
12050 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
12060 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
12070 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12080 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
12090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
120a0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
120b0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
120c0 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20  KASIDE_HIT,.    
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
120f0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
12100 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12110 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73  rg->out, "Succes
12120 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61  sful lookaside a
12130 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25  ttempts:       %
12140 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
12150 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
12160 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12170 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12180 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
12190 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20  DE_MISS_SIZE,.  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
121c0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
121d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
121e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
121f0 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
12200 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
12210 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
12220 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
12230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
12240 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
12250 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
12260 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a  SIDE_MISS_FULL,.
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
12290 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
122a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
122b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
122c0 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
122d0 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20   due to OOM:    
122e0 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
122f0 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
12300 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
12310 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12320 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12330 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12340 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
12350 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
12360 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12370 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12380 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
12390 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
123b0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
123c0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
123d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
123e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
123f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12400 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12410 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72  CACHE_HIT, &iCur
12420 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
12430 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12440 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
12450 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12470 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12480 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
12490 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
124a0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
124b0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
124c0 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
124d0 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
124e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
124f0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
12500 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12520 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12530 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
12540 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
12550 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
12560 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
12570 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
12580 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12590 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
125a0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
125b0 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
125e0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
125f0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12600 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12610 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12620 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43  CACHE_SPILL, &iC
12630 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12640 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12650 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12660 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20   cache spills:  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12690 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
126a0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
126b0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
126c0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
126d0 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
126e0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
126f0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12700 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12710 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73   "Schema Heap Us
12720 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
12730 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
12740 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12750 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12760 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12770 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12780 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12790 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
127a0 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
127b0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
127c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
127d0 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
127e0 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
127f0 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
12800 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
12810 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d        iCur);.  }
12820 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
12830 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20  tmt ){.    iCur 
12840 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12850 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12860 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12870 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
12880 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EP,.            
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20     bReset);.    
128b0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
128c0 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20  >out, "Fullscan 
128d0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
128e0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
128f0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
12900 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
12910 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
12920 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
12930 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52  TSTATUS_SORT, bR
12940 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12950 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12960 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e   "Sort Operation
12970 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12980 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12990 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129b0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
129c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
129d0 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65  US_AUTOINDEX,bRe
129e0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
129f0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12a00 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72  "Autoindex Inser
12a10 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
12a20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12a30 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12a40 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12a50 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12a60 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12a70 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65  S_VM_STEP, bRese
12a80 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
12a90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56  tf(pArg->out, "V
12aa0 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53  irtual Machine S
12ab0 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
12ac0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12ad0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12ae0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12af0 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12b00 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12b10 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65  REPREPARE, bRese
12b20 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
12b30 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52  tf(pArg->out, "R
12b40 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69  eprepare operati
12b50 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  ons:            
12b60 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12b70 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12b80 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12b90 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12ba0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12bb0 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  RUN, bReset);.  
12bc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12bd0 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
12be0 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20  of times run:   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12c00 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12c10 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12c20 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12c30 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12c40 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45  TMTSTATUS_MEMUSE
12c50 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  D, bReset);.    
12c60 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12c70 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73  >out, "Memory us
12c80 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73  ed by prepared s
12c90 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e  tmt:        %d\n
12ca0 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23  ", iCur);.  }..#
12cb0 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
12cc0 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f    displayLinuxIo
12cd0 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29  Stats(pArg->out)
12ce0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
12cf0 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69  o not remove thi
12d00 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62  s machine readab
12d10 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72  le comment: extr
12d20 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68  a-stats-output-h
12d30 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ere */..  return
12d40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
12d50 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e  play scan stats.
12d60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12d70 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
12d80 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
12d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12da0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12db0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
12dc0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20  hellState *pArg 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12de0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
12df0 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69  llState */.){.#i
12e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
12e10 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
12e20 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  TUS.  UNUSED_PAR
12e30 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
12e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12e50 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Arg);.#else.  in
12e60 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20  t i, k, n, mx;. 
12e70 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12e80 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12e90 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d   scanstats -----
12ea0 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20  ---\n");.  mx = 
12eb0 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  0;.  for(k=0; k<
12ec0 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64  =mx; k++){.    d
12ed0 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d  ouble rEstLoop =
12ee0 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   1.0;.    for(i=
12ef0 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20  n=0; 1; i++){.  
12f00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12f10 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d   *p = pArg->pStm
12f20 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12f30 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56  _int64 nLoop, nV
12f40 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62  isit;.      doub
12f50 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69  le rEst;.      i
12f60 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63  nt iSid;.      c
12f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
12f80 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ain;.      if( s
12f90 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
12fa0 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
12fb0 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f  ITE_SCANSTAT_NLO
12fc0 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f  OP, (void*)&nLoo
12fd0 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  p) ){.        br
12fe0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12ff0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
13000 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
13010 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
13020 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64  _SELECTID, (void
13030 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20  *)&iSid);.      
13040 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78  if( iSid>mx ) mx
13050 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69   = iSid;.      i
13060 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e  f( iSid!=k ) con
13070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
13080 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
13090 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75   rEstLoop = (dou
130a0 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20  ble)nLoop;.     
130b0 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77     if( k>0 ) raw
130c0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
130d0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62  t, "-------- sub
130e0 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d  query %d -------
130f0 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d  \n", k);.      }
13100 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13110 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13120 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
13130 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
13140 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
13150 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73  nVisit);.      s
13160 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
13170 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
13180 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54  ITE_SCANSTAT_EST
13190 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b  , (void*)&rEst);
131a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
131b0 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
131c0 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
131d0 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76  STAT_EXPLAIN, (v
131e0 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b  oid*)&zExplain);
131f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
13200 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
13210 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20  oop %2d: %s\n", 
13220 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  n, zExplain);.  
13230 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20      rEstLoop *= 
13240 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f  rEst;.      raw_
13250 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
13260 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ,.          "   
13270 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c        nLoop=%-8l
13280 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65  ld nRow=%-8lld e
13290 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74  stRow=%-8lld est
132a0 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22  Row/Loop=%-8g\n"
132b0 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f  ,.          nLoo
132c0 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69  p, nVisit, (sqli
132d0 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c  te3_int64)(rEstL
132e0 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20  oop+0.5), rEst. 
132f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13300 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  }.  raw_printf(p
13310 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64  ------\n");.#end
13340 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  if.}../*.** Para
13350 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f  meter azArray po
13360 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74  ints to a zero-t
13370 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20  erminated array 
13380 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72  of strings. zStr
13390 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
133a0 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69  single nul-termi
133b0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65  nated string. Re
133c0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
133d0 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61   zStr.** is equa
133e0 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  l, according to 
133f0 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79  strcmp(), to any
13400 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20   of the strings 
13410 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
13420 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
13430 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
13440 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72  ic int str_in_ar
13450 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ray(const char *
13460 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
13470 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69   **azArray){.  i
13480 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
13490 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b   azArray[i]; i++
134a0 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
134b0 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72  rcmp(zStr, azArr
134c0 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ay[i]) ) return 
134d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
134e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  0;.}../*.** If c
134f0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
13500 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74  t pSql appears t
13510 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20  o be an EXPLAIN 
13520 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63  statement, alloc
13530 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  ate.** and popul
13540 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61  ate the ShellSta
13550 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  te.aiIndent[] ar
13560 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ray with the num
13570 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73  ber of.** spaces
13580 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f   each opcode sho
13590 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20  uld be indented 
135a0 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74  before it is out
135b0 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  put..**.** The i
135c0 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61  ndenting rules a
135d0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  re:.**.**     * 
135e0 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c  For each "Next",
135f0 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22   "Prev", "VNext"
13600 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74   or "VPrev" inst
13610 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a  ruction, indent.
13620 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63  **       all opc
13630 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  odes that occur 
13640 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a  between the p2 j
13650 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
13660 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a  and the opcode.*
13670 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62  *       itself b
13680 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a  y 2 spaces..**.*
13690 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68  *     * For each
136a0 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20   "Goto", if the 
136b0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
136c0 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74   is earlier in t
136d0 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20  he program.**   
136e0 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20      and ends on 
136f0 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20  one of:.**      
13700 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47      Yield  SeekG
13710 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65  t  SeekLt  RowSe
13720 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a  tRead  Rewind.**
13730 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65         or if the
13740 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
13750 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20   one instead of 
13760 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74  zero,.**       t
13770 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f  hen indent all o
13780 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74  pcodes between t
13790 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72  he earlier instr
137a0 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  uction.**       
137b0 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20  and "Goto" by 2 
137c0 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
137d0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
137e0 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c  ata_prepare(Shel
137f0 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74  lState *p, sqlit
13800 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a  e3_stmt *pSql){.
13810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
13820 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
13830 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66    /* The text of
13840 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
13850 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
13860 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
13870 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13880 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  to check if this
13890 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a   is an EXPLAIN *
138a0 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64  /.  int *abYield
138b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
138c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
138d0 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64  p is an OP_Yield
138e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
138f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13900 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
13910 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69  ed size of p->ai
13920 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c  Indent[], abYiel
13930 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20  d */.  int iOp; 
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13950 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13960 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  of operation in 
13970 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  p->aiIndent[] */
13980 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
13990 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65  azNext[] = { "Ne
139a0 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50  xt", "Prev", "VP
139b0 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22  rev", "VNext", "
139c0 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20 7d  SorterNext", 0 }
139d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
139e0 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
139f0 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
13a00 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
13a10 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
13a40 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
13a50 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
13a60 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
13a70 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
13a80 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
13a90 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
13aa0 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
13ab0 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
13ac0 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
13ad0 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
13ae0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
13af0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21  umn_count(pSql)!
13b00 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  =8 ){.    p->cMo
13b10 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13b20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
13b30 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
13b40 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  ql(pSql);.  if( 
13b50 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
13b60 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20  ;.  for(z=zSql; 
13b70 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27  *z==' ' || *z=='
13b80 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20  \t' || *z=='\n' 
13b90 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a  || *z=='\f' || *
13ba0 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20  z=='\r'; z++);. 
13bb0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
13bc0 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69  nicmp(z, "explai
13bd0 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d  n", 7) ){.    p-
13be0 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
13bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
13c00 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  }..  for(iOp=0; 
13c10 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
13c20 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
13c30 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
13c40 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
13c50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13c60 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
13c70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13c80 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
13c90 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
13ca0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
13cb0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
13cc0 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
13cd0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
13ce0 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
13cf0 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
13d00 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
13d10 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
13d20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
13d30 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
13d40 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
13d50 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
13d60 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
13d70 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
13d80 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
13d90 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
13da0 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
13db0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
13dc0 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
13dd0 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
13de0 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
13df0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
13e00 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
13e10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
13e20 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
13e30 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
13e40 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
13e50 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
13e60 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
13e70 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
13e80 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
13e90 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66  lloc ){.      if
13ea0 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iOp==0 ){.    
13eb0 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65      /* Do furthe
13ec0 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68  r verfication th
13ed0 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61  at this is expla
13ee0 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72  in output.  Abor
13ef0 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t if.        ** 
13f00 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20  it is not */.   
13f10 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
13f20 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43  t char *explainC
13f30 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ols[] = {.      
13f40 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
13f50 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
13f60 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
13f70 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d  p5", "comment" }
13f80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a  ;.        int jj
13f90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  ;.        for(jj
13fa0 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65  =0; jj<ArraySize
13fb0 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a  (explainCols); j
13fc0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
13fd0 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
13fe0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
13ff0 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43  Sql,jj),explainC
14000 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20  ols[jj])!=0 ){. 
14010 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d             p->cM
14020 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
14030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14040 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
14050 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14060 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
14070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14080 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  }.      nAlloc +
14090 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 100;.      p->
140a0 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a  aiIndent = (int*
140b0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
140c0 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  64(p->aiIndent, 
140d0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
140e0 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t));.      if( p
140f0 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20  ->aiIndent==0 ) 
14100 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
14110 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62 59  ory();.      abY
14120 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c  ield = (int*)sql
14130 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61  ite3_realloc64(a
14140 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73  bYield, nAlloc*s
14150 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
14160 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d 3d     if( abYield==
14170 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
14180 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
14190 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70  .    abYield[iOp
141a0 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  ] = str_in_array
141b0 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a  (zOp, azYield);.
141c0 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b      p->aiIndent[
141d0 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  iOp] = 0;.    p-
141e0 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31  >nIndent = iOp+1
141f0 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69  ;..    if( str_i
14200 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e  n_array(zOp, azN
14210 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  ext) ){.      fo
14220 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
14230 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
14240 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
14250 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
14260 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74  array(zOp, azGot
14270 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49  o) && p2op<p->nI
14280 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61  ndent.     && (a
14290 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20  bYield[p2op] || 
142a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
142b0 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20  nt(pSql, 2)).   
142c0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
142d0 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
142e0 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
142f0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 2;.    }.  }
14300 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ..  p->iIndent =
14310 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
14320 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73  ee(abYield);.  s
14330 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
14340 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
14350 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f  e the array allo
14360 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e  cated by explain
14370 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e  _data_prepare().
14380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14390 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
143a0 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ete(ShellState *
143b0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
143c0 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
143d0 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
143e0 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
143f0 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
14400 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
14410 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73   Disable and res
14420 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65  tore .wheretrace
14430 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63   and .selecttrac
14440 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23  e settings..*/.#
14450 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14460 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14470 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14480 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65  E_SELECTTRACE).e
14490 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
144a0 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74  3SelectTrace;.st
144b0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65  atic int savedSe
144c0 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
144d0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
144e0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
144f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14500 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
14510 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
14520 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73  te3WhereTrace;.s
14530 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57  tatic int savedW
14540 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
14550 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  f.static void di
14560 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
14570 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14580 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14590 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
145a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
145b0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
145c0 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
145d0 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  e = sqlite3Selec
145e0 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  tTrace;.  sqlite
145f0 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30  3SelectTrace = 0
14600 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
14610 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
14620 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
14630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
14640 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57  ETRACE).  savedW
14650 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69  hereTrace = sqli
14660 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
14670 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
14680 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  ce = 0;.#endif.}
14690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
146a0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
146b0 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
146c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
146d0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
146e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
146f0 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
14700 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
14710 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74  ce = savedSelect
14720 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
14730 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14740 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
14750 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
14760 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
14770 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14780 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61   = savedWhereTra
14790 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ce;.#endif.}../*
147a0 20 43 72 65 61 74 65 20 74 68 65 20 54 45 4d 50   Create the TEMP
147b0 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 73   table used to s
147c0 74 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20 62  tore parameter b
147d0 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74 69  indings */.stati
147e0 63 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62 6c  c void bind_tabl
147f0 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61 74  e_init(ShellStat
14800 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72 53  e *p){.  int wrS
14810 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71 6c  chema = 0;.  sql
14820 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
14830 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  ->db, SQLITE_DBC
14840 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f 53  ONFIG_WRITABLE_S
14850 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53 63  CHEMA, -1, &wrSc
14860 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
14870 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62  _db_config(p->db
14880 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
14890 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d  G_WRITABLE_SCHEM
148a0 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 1, 0);.  sqli
148b0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
148c0 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
148d0 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
148e0 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72 61  temp.sqlite_para
148f0 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20 22  meters(\n".    "
14900 20 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41    key TEXT PRIMA
14910 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 22  RY KEY,\n".    "
14920 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a 20    value ANY\n". 
14930 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52 4f     ") WITHOUT RO
14940 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30 2c  WID;",.    0, 0,
14950 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64   0);.  sqlite3_d
14960 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
14970 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
14980 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c  WRITABLE_SCHEMA,
14990 20 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a 7d   wrSchema, 0);.}
149a0 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61 72  ../*.** Bind par
149b0 61 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72 65  ameters on a pre
149c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
149d0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
149e0 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74 61   bindings are ta
149f0 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50 20  ken from a TEMP 
14a00 74 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f 72  table of the for
14a10 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  m:.**.**    CREA
14a20 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71  TE TEMP TABLE sq
14a30 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28  lite_parameters(
14a40 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52 59  key TEXT PRIMARY
14a50 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a 20   KEY, value).** 
14a60 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44     WITHOUT ROWID
14a70 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64 69  ;.**.** No bindi
14a80 6e 67 73 20 6f 63 63 75 72 20 69 66 20 74 68 69  ngs occur if thi
14a90 73 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  s table does not
14aa0 20 65 78 69 73 74 2e 20 20 54 68 65 20 73 70 65   exist.  The spe
14ab0 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 20 27  cial character '
14ac0 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65  $'.** is include
14ad0 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e  d in the table n
14ae0 61 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65 76  ame to help prev
14af0 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ent collisions w
14b00 69 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c 65  ith actual table
14b10 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  s..** The table 
14b20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 54  must be in the T
14b30 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 73  EMP schema..*/.s
14b40 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64 5f  tatic void bind_
14b50 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53 68  prepared_stmt(Sh
14b60 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
14b70 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14b80 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61 72  tmt){.  int nVar
14b90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
14ba0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
14bb0 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20 20  tmt *pQ = 0;..  
14bc0 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
14bd0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
14be0 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  unt(pStmt);.  if
14bf0 28 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74 75  ( nVar==0 ) retu
14c00 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20  rn;  /* Nothing 
14c10 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20 73  to do */.  if( s
14c20 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
14c30 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41 72  umn_metadata(pAr
14c40 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20 22  g->db, "TEMP", "
14c50 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14c60 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20 30          "key", 0
14c90 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d 53  , 0, 0, 0, 0)!=S
14ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14cb0 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61 6d  return; /* Param
14cc0 65 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73 20  eter table does 
14cd0 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 7d  not exist */.  }
14ce0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14cf0 70 72 65 70 61 72 65 5f 76 32 28 70 41 72 67 2d  prepare_v2(pArg-
14d00 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
14d10 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
14d20 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61  M temp.sqlite_pa
14d30 72 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20 20  rameters".      
14d40 20 20 20 20 22 20 57 48 45 52 45 20 6b 65 79 3d      " WHERE key=
14d50 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30 29  ?1", -1, &pQ, 0)
14d60 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70 51  ;.  if( rc || pQ
14d70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14d80 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
14d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
14da0 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 63   zNum[30];.    c
14db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
14dc0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14dd0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
14de0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tmt, i);.    if(
14df0 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zVar==0 ){.    
14e00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14e10 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2c  tf(sizeof(zNum),
14e20 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a 20  zNum,"?%d",i);. 
14e30 20 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75 6d       zVar = zNum
14e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e50 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 51  te3_bind_text(pQ
14e60 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20 53  , 1, zVar, -1, S
14e70 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14e80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
14e90 74 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45 5f  tep(pQ)==SQLITE_
14ea0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ROW ){.      sql
14eb0 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
14ec0 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74 65  pStmt, i, sqlite
14ed0 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
14ee0 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Q, 0));.    }els
14ef0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
14f00 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
14f10 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
14f20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 51  sqlite3_reset(pQ
14f30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14f40 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a 7d  _finalize(pQ);.}
14f50 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72  ../*.** Run a pr
14f60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14f70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14f80 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
14f90 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  mt(.  ShellState
14fa0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
14fd0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
14fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
14ff0 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20  t *pStmt        
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e        /* Statmen
15020 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20  t to run */.){. 
15030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70   int rc;..  /* p
15040 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
15050 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
15060 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
15070 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75    ** have a resu
15080 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e  lt set or not an
15090 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73  d how wide it is
150a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
150b0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
150c0 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61  );.  /* if we ha
150d0 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
150e0 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .. */.  if( SQLI
150f0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
15100 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
15110 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61  space for col na
15120 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74  me ptr, value pt
15130 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20  r, and type */. 
15140 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
15150 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
15160 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76  nt(pStmt);.    v
15170 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c  oid *pData = sql
15180 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a  ite3_malloc64(3*
15190 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73  nCol*sizeof(cons
151a0 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20  t char*) + 1);. 
151b0 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b     if( !pData ){
151c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
151d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
151e0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
151f0 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72  **azCols = (char
15200 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20   **)pData;      
15210 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75  /* Names of resu
15220 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
15230 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c      char **azVal
15240 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c  s = &azCols[nCol
15250 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ];       /* Resu
15260 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
15270 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74   *aiTypes = (int
15280 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d   *)&azVals[nCol]
15290 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65  ; /* Result type
152a0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
152b0 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , x;.      asser
152c0 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d  t(sizeof(int) <=
152d0 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29   sizeof(char *))
152e0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20  ;.      /* save 
152f0 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75  off ptrs to colu
15300 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
15310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15320 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
15330 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68   azCols[i] = (ch
15340 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
15350 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
15360 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
15370 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a    do{.        /*
15380 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74   extract the dat
15390 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73  a and data types
153a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
153b0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
153c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54  ){.          aiT
153d0 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71  ypes[i] = x = sq
153e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
153f0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
15400 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51         if( x==SQ
15410 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72  LITE_BLOB && pAr
15420 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65  g && pArg->cMode
15430 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b  ==MODE_Insert ){
15440 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56  .            azV
15450 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20  als[i] = "";.   
15460 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15470 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73            azVals
15480 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  [i] = (char*)sql
15490 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
154a0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
154b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
154c0 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d    if( !azVals[i]
154d0 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21   && (aiTypes[i]!
154e0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
154f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15500 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15510 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15520 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a  k; /* from for *
15530 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  /.          }.  
15540 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66        } /* end f
15550 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  or */..        /
15560 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79  * if data and ty
15570 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75  pes extracted su
15580 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f  ccessfully... */
15590 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
155a0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
155b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61  .          /* ca
155c0 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  ll the supplied 
155d0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
155e0 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74  e result row dat
155f0 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  a */.          i
15600 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  f( shell_callbac
15610 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a  k(pArg, nCol, az
15620 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69  Vals, azCols, ai
15630 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20  Types) ){.      
15640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15650 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20  E_ABORT;.       
15660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15680 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
15690 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
156a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68      }.      } wh
156b0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20  ile( SQLITE_ROW 
156c0 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73  == rc );.      s
156d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
156e0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  a);.    }.  }.}.
156f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15700 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15710 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  E./*.** This fun
15720 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15730 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69  to process SQL i
15740 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
15750 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  hell command.** 
15760 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49  was ".expert". I
15770 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c  t passes the SQL
15780 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
15790 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79  rgument directly
157a0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   to.** the sqlit
157b0 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e  e3expert object.
157c0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
157d0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
157e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
157f0 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
15800 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e  e error.** code.
15810 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28   In this case, (
15820 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73  *pzErr) may be s
15830 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
15840 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15850 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68  ng.** an English
15860 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
15870 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
15880 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15890 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
158a0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
158b0 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
158c0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
158d0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
158e0 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64  c int expertHand
158f0 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74  leSQL(.  ShellSt
15900 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20  ate *pState, .  
15910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
15920 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
15930 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  r.){.  assert( p
15940 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
15950 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72  xpert );.  asser
15960 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a  t( pzErr==0 || *
15970 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65  pzErr==0 );.  re
15980 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70  turn sqlite3_exp
15990 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e  ert_sql(pState->
159a0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20  expert.pExpert, 
159b0 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a  zSql, pzErr);.}.
159c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
159d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65  tion is called e
159e0 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c  ither to silentl
159f0 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f  y clean up the o
15a00 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64  bject.** created
15a10 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74   by the ".expert
15a20 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43  " command (if bC
15a30 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f  ancel==1), or to
15a40 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20   generate a .** 
15a50 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61  report from it a
15a60 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74  nd then clean it
15a70 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d   up (if bCancel=
15a80 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  =0)..**.** If su
15a90 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
15aa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15ab0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
15ac0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
15ad0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
15ae0 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
15af0 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
15b00 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
15b10 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
15b20 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
15b30 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
15b40 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
15b50 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
15b60 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
15b70 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
15b80 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
15b90 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
15ba0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
15bb0 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53  Finish(.  ShellS
15bc0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20  tate *pState,.  
15bd0 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63  int bCancel,.  c
15be0 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
15bf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15c00 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78  _OK;.  sqlite3ex
15c10 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65  pert *p = pState
15c20 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15c30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
15c40 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63  .  assert( bCanc
15c50 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c  el || pzErr==0 |
15c60 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  | *pzErr==0 );. 
15c70 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20   if( bCancel==0 
15c80 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  ){.    FILE *out
15c90 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a   = pState->out;.
15ca0 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65      int bVerbose
15cb0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
15cc0 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20  t.bVerbose;..   
15cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
15ce0 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20  pert_analyze(p, 
15cf0 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  pzErr);.    if( 
15d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d10 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72  .      int nQuer
15d20 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  y = sqlite3_expe
15d30 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20  rt_count(p);.   
15d40 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
15d50 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
15d60 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15d70 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c  har *zCand = sql
15d80 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
15d90 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45  rt(p,0,EXPERT_RE
15da0 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29  PORT_CANDIDATES)
15db0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
15dc0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61  intf(out, "-- Ca
15dd0 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d  ndidates -------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20  ------\n");.    
15e00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
15e10 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e  ut, "%s\n", zCan
15e20 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
15e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75    for(i=0; i<nQu
15e40 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ery; i++){.     
15e50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15e60 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Sql = sqlite3_ex
15e70 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
15e80 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
15e90 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  SQL);.        co
15ea0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
15eb0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15ec0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15ed0 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58  ERT_REPORT_INDEX
15ee0 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ES);.        con
15ef0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
15f00 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15f10 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15f20 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b  RT_REPORT_PLAN);
15f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64  .        if( zId
15f40 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28  x==0 ) zIdx = "(
15f50 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c  no new indexes)\
15f60 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n";.        if( 
15f70 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
15f80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15f90 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20  (out, "-- Query 
15fa0 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  %d -------------
15fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fc0 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20  ---\n",i+1);.   
15fd0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15fe0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c  f(out, "%s\n\n",
15ff0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
16000 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
16010 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
16020 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , zIdx);.       
16030 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
16040 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a   "%s\n", zEQP);.
16050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16060 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65  }.  sqlite3_expe
16070 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20  rt_destroy(p);. 
16080 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
16090 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72  pExpert = 0;.  r
160a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
160b0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
160c0 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64  n of ".expert" d
160d0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
160e0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
160f0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
16100 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
16110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16120 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
16130 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
16140 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16160 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
16170 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
16180 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
16190 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
161c0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
161d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
161e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
161f0 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
16200 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61  int i;.  int iSa
16210 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  mple = 0;..  ass
16220 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70  ert( pState->exp
16230 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29  ert.pExpert==0 )
16240 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61  ;.  memset(&pSta
16250 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73  te->expert, 0, s
16260 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f  izeof(ExpertInfo
16270 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ));..  for(i=1; 
16280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16290 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
162a0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41     char *z = azA
162b0 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rg[i];.    int n
162c0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
162d0 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
162e0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20   ) z++;.    n = 
162f0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
16300 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
16310 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72  strncmp(z, "-ver
16320 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  bose", n) ){.   
16330 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
16340 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  t.bVerbose = 1;.
16350 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
16360 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74  f( n>=2 && 0==st
16370 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c  rncmp(z, "-sampl
16380 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20  e", n) ){.      
16390 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20  if( i==(nArg-1) 
163a0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
163b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
163c0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
163d0 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e  n argument: %s\n
163e0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
163f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16410 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d         iSample =
16420 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
16430 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a  ue(azArg[++i]);.
16440 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d          if( iSam
16450 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65  ple<0 || iSample
16460 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
16470 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
16480 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20  err, "value out 
16490 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c  of range: %s\n",
164a0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
164b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
164c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
164d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
164e0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
164f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
16500 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
16510 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ion: %s\n", z);.
16520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16530 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
16540 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
16550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16560 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
16570 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  xpert = sqlite3_
16580 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74  expert_new(pStat
16590 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20  e->db, &zErr);. 
165a0 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65     if( pState->e
165b0 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
165c0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
165d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
165e0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77  lite3_expert_new
165f0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
16600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16610 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
16620 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
16630 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28  3_expert_config(
16640 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74  .          pStat
16650 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
16660 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47  t, EXPERT_CONFIG
16670 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65  _SAMPLE, iSample
16680 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
16690 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
166a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
166b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
166c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
166d0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
166e0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
166f0 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
16700 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20  .  Print.** any 
16710 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
16720 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
16730 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
16740 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65  e.** set via the
16750 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
16760 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
16770 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74  s very similar t
16780 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  o SQLite's built
16790 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63  -in sqlite3_exec
167a0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ().** function e
167b0 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
167c0 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
167d0 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ent callback.** 
167e0 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74  and callback dat
167f0 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  a argument..*/.s
16800 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
16810 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61  exec(.  ShellSta
16820 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16850 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
16860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
16870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
16890 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64   to be evaluated
168a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
168b0 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
168e0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
168f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16900 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  pStmt = NULL;   
16910 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
16920 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
16930 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16940 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
16950 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
16960 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63  /.  int rc2;.  c
16970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
16980 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  over;          /
16990 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63  * Tail of unproc
169a0 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73  essed SQL */.  s
169b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72  qlite3 *db = pAr
169c0 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a  g->db;..  if( pz
169d0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70  ErrMsg ){.    *p
169e0 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a  zErrMsg = NULL;.
169f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16a00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16a10 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67  TABLE.  if( pArg
16a20 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16a30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70   ){.    rc = exp
16a40 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72  ertHandleSQL(pAr
16a50 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73  g, zSql, pzErrMs
16a60 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  g);.    return e
16a70 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67  xpertFinish(pArg
16a80 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  , (rc!=SQLITE_OK
16a90 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ), pzErrMsg);.  
16aa0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
16ab0 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53  e( zSql[0] && (S
16ac0 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20  QLITE_OK == rc) 
16ad0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
16ae0 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53  nst char *zStmtS
16af0 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ql;.    rc = sql
16b00 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16b10 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
16b20 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72  Stmt, &zLeftover
16b30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
16b40 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20  E_OK != rc ){.  
16b50 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67      if( pzErrMsg
16b60 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16b70 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16b80 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16b90 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
16ba0 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b     if( !pStmt ){
16bb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73  .        /* this
16bc0 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63   happens for a c
16bd0 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d  omment or white-
16be0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  space */.       
16bf0 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65   zSql = zLeftove
16c00 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  r;.        while
16c10 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30  ( IsSpace(zSql[0
16c20 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
16c30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74       }.      zSt
16c50 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  mtSql = sqlite3_
16c60 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
16c70 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d    if( zStmtSql==
16c80 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22  0 ) zStmtSql = "
16c90 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ";.      while( 
16ca0 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c  IsSpace(zStmtSql
16cb0 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b  [0]) ) zStmtSql+
16cc0 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76  +;..      /* sav
16cd0 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72  e off the prepar
16ce0 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64  ed statment hand
16cf0 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77  le and reset row
16d00 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   count */.      
16d10 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
16d20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
16d30 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  = pStmt;.       
16d40 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a   pArg->cnt = 0;.
16d50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16d60 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73  * echo the sql s
16d70 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f  tatement if echo
16d80 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16d90 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61   pArg && ShellHa
16da0 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c  sFlag(pArg, SHFL
16db0 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20  G_Echo) ){.     
16dc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
16dd0 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  Arg->out, "%s\n"
16de0 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74  , zStmtSql ? zSt
16df0 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20  mtSql : zSql);. 
16e00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16e10 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49   Show the EXPLAI
16e20 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20  N QUERY PLAN if 
16e30 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20  .eqp is on */.  
16e40 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
16e50 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26  pArg->autoEQP &&
16e60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73   sqlite3_stmt_is
16e70 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d  explain(pStmt)==
16e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
16e90 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
16ea0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ain;.        cha
16eb0 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20  r *zEQP;.       
16ec0 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20   int triggerEQP 
16ed0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73  = 0;.        dis
16ee0 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
16ef0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
16f00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16f10 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16f20 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
16f30 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65  EQP, -1, &trigge
16f40 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69  rEQP);.        i
16f50 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
16f60 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
16f70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
16f80 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
16f90 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
16fa0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
16fb0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
16fc0 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20   }.        zEQP 
16fd0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16fe0 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  f("EXPLAIN QUERY
16ff0 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74   PLAN %s", zStmt
17000 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Sql);.        rc
17010 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
17020 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
17030 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
17040 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17060 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
17070 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
17080 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
17090 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
170a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
170b0 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74  EQPLine = (const
170c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
170d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
170e0 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20  ain,3);.        
170f0 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d      int iEqpId =
17100 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17110 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29  int(pExplain, 0)
17120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
17130 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71  t iParentId = sq
17140 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
17150 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20  (pExplain, 1);. 
17160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
17170 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20  EQPLine[0]=='-' 
17180 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72  ) eqp_render(pAr
17190 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
171a0 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c  eqp_append(pArg,
171b0 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74   iEqpId, iParent
171c0 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20  Id, zEQPLine);. 
171d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
171e0 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28       eqp_render(
171f0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  pArg);.        }
17200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17210 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
17220 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  in);.        sql
17230 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
17240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
17250 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
17260 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20  EQP_full ){.    
17270 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f        /* Also do
17280 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20   an EXPLAIN for 
17290 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65  ".eqp full" mode
172a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
172b0 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  QP = sqlite3_mpr
172c0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73  intf("EXPLAIN %s
172d0 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20  ", zStmtSql);.  
172e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
172f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
17300 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
17310 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
17320 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17340 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
17350 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
17360 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  in;.            
17370 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
17380 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c  pare(pArg, pExpl
17390 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
173a0 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
173b0 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c  stmt(pArg, pExpl
173c0 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
173d0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
173e0 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20  elete(pArg);.   
173f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17400 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
17410 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
17420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17430 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
17440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17450 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
17460 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
17470 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d  r && triggerEQP=
17480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17490 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
174a0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
174b0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
174c0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 0, 0);.      
174d0 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65      /* Reprepare
174e0 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65   pStmt before re
174f0 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d  activing trace m
17500 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  odes */.        
17510 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17520 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
17530 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65       sqlite3_pre
17540 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
17550 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
17560 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17570 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74  pArg ) pArg->pSt
17580 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
17590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
175a0 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
175b0 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
175c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41   }..      if( pA
175d0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
175e0 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67  rg->cMode = pArg
175f0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
17600 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78  if( pArg->autoEx
17610 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
17620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
17630 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53  tmt_isexplain(pS
17640 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  tmt)==1 ){.     
17650 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17660 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
17670 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
17680 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
17690 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c  ite3_stmt_isexpl
176a0 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b  ain(pStmt)==2 ){
176b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72  .            pAr
176c0 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
176d0 45 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  EQP;.          }
176e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
176f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68      /* If the sh
17700 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ell is currently
17710 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d   in ".explain" m
17720 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20  ode, gather the 
17730 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a  extra.        **
17740 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74   data required t
17750 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f  o add indents to
17760 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20   the output.*/. 
17770 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
17780 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  >cMode==MODE_Exp
17790 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
177a0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
177b0 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74  repare(pArg, pSt
177c0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mt);.        }. 
177d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69       }..      bi
177e0 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  nd_prepared_stmt
177f0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
17800 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
17810 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
17820 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
17830 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
17840 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70  pArg);.      eqp
17850 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a  _render(pArg);..
17860 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
17870 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
17880 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
17890 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
178a0 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
178b0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
178c0 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
178d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
178e0 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
178f0 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
17900 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
17910 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
17920 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
17930 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
17940 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
17950 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17960 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
17970 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
17980 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
17990 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
179a0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
179b0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
179c0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
179d0 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
179e0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
179f0 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
17a00 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
17a10 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
17a20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17a30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
17a40 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
17a50 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
17a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
17a80 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
17a90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
17aa0 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
17ab0 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
17ac0 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
17ad0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
17ae0 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
17af0 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
17b00 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
17b10 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
17b20 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
17b30 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
17b40 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
17b50 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
17b60 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
17b70 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
17b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17b90 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
17ba0 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
17bb0 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
17bc0 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
17bd0 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
17be0 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
17bf0 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
17c00 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
17c10 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
17c20 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
17c30 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
17c40 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
17c50 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
17c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
17c70 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
17c80 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
17c90 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
17ca0 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
17cb0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
17cc0 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
17cd0 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
17ce0 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
17cf0 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
17d00 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
17d10 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
17d20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
17d30 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
17d40 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
17d50 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
17d60 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
17d70 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
17d80 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
17d90 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
17da0 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
17db0 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
17dc0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
17dd0 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
17de0 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
17df0 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
17e00 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
17e10 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
17e20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
17e30 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
17e40 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
17e50 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
17e60 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
17e70 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
17e80 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
17e90 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
17ea0 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
17eb0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
17ec0 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
17ed0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
17ee0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
17ef0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
17f00 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
17f10 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
17f20 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
17f30 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
17f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
17f50 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
17f60 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
17f70 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
17f80 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
17f90 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
17fa0 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
17fb0 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
17fc0 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
17fd0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
17fe0 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
17ff0 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
18000 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18010 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
18020 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
18030 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18040 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
18050 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
18060 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
18070 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
18080 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18090 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
180a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
180b0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
180c0 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
180d0 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
180e0 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
180f0 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
18100 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
18110 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
18120 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
18130 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
18140 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
18150 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
18160 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
18170 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
18180 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18190 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
181a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
181b0 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
181c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
181d0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
181e0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
181f0 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
18200 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18210 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
18220 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
18230 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
18240 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
18260 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
18270 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
18280 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
18290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
182a0 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
182b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
182c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
182d0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
182e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
182f0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
18300 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
18310 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
18320 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
18330 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
18340 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
18350 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
18360 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
18370 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
18380 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
18390 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
183a0 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
183b0 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
183c0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
183d0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
183e0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
183f0 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
18400 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
18410 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
18420 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
18430 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
18440 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
18450 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
18460 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
18470 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
18480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
18490 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
184a0 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
184b0 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
184c0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
184d0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
184e0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
184f0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
18500 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
18510 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
18520 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
18530 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
18540 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
18550 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
18560 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
18570 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
18580 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
18590 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
185a0 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
185b0 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
185c0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
185d0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
185e0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
185f0 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
18600 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
18610 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
18620 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
18630 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
18640 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
18650 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
18660 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
18670 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
18680 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
18690 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
186c0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
186d0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
186e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
186f0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
18700 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
18710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18720 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
18730 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
18740 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
18750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18760 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
18770 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
18780 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
18790 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
187a0 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
187b0 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
187c0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
187d0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
187e0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
187f0 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
18800 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
18810 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
18820 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
18830 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
18840 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
18850 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
18860 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
18870 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
18880 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18890 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
188a0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
188b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
188c0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
188d0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
188e0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
188f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18900 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
18910 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
18920 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
18930 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
18940 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
18950 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
18960 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
18970 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
18980 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
18990 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
189a0 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
189b0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
189c0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
189d0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
189e0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
189f0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18a00 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
18a10 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
18a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18a30 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
18a40 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
18a50 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
18a60 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
18a70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18a80 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
18a90 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
18aa0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ac0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
18ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
18ae0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
18af0 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
18b00 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
18b10 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
18b20 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
18b30 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
18b40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18b50 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
18b60 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
18b70 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
18b80 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
18b90 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
18ba0 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
18bb0 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
18bc0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
18bd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18be0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18bf0 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
18c00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18c10 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
18c20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
18c30 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
18c40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
18c50 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
18c60 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
18c70 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18c80 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
18c90 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
18ca0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
18cb0 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
18cc0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
18cd0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
18ce0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
18cf0 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
18d00 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
18d10 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
18d20 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
18d30 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
18d40 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
18d50 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
18d60 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
18d70 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
18d80 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
18d90 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
18da0 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
18db0 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
18dc0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
18dd0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
18de0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
18df0 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
18e00 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
18e10 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
18e20 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
18e30 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
18e40 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
18e50 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
18e60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18e70 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
18e80 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
18e90 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
18ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
18eb0 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
18ec0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
18ed0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
18ee0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
18ef0 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
18f00 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
18f10 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
18f20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
18f30 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
18f40 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
18f50 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18f60 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
18f70 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
18f80 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
18f90 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
18fa0 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
18fb0 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
18fc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
18fd0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
18fe0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
18ff0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
19000 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
19010 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
19020 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
19040 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
19050 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
19060 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
19070 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
19080 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
19090 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
190a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
190b0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
190c0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
190d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
190e0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
190f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
19100 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
19110 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
19120 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
19130 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
19140 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
19150 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
19160 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
19170 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
19180 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
19190 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
191a0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
191b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
191c0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
191d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
191e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
191f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
19200 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
19210 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
19220 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
19230 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
19240 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
19250 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
19260 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
19270 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
19280 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
19290 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
192a0 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
192b0 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
192c0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
192d0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
192e0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
192f0 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
19300 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
19310 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19320 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
19330 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
19340 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
19350 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
19360 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
19370 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
19380 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
19390 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
193a0 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
193b0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
193c0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
193d0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
193e0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
193f0 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
19400 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
19410 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
19420 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
19430 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
19440 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
19450 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
19460 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
19470 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
19480 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
19490 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
194a0 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
194b0 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
194c0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
194d0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
194e0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
194f0 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
19500 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
19510 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
19520 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
19530 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19540 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
19550 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19560 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
19570 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
19580 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
19590 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
195a0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
195b0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
195c0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
195d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
195e0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
195f0 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
19600 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
19610 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
19620 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
19630 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
19640 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
19650 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19660 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19670 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
19680 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
19690 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
196a0 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
196b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
196c0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
196d0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
196e0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
196f0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
19700 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
19710 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
19720 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
19730 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
19740 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
19750 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
19760 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
19770 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19780 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
19790 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
197a0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
197b0 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
197c0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
197d0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
197e0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
197f0 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
19800 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
19810 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
19820 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
19830 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
19840 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
19850 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
19860 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
19870 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
19880 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
19890 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
198a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
198b0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
198c0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
198d0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
198e0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
198f0 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
19900 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
19910 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
19920 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
19930 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
19940 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
19950 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
19960 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
19970 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
19980 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
19990 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
199a0 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
199b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
199c0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
199d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
199e0 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
199f0 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
19a00 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
19a10 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
19a20 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
19a30 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
19a40 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
19a50 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
19a60 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
19a70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19a80 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
19a90 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
19aa0 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
19ab0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
19ac0 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
19ad0 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
19ae0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
19af0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
19b00 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
19b10 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
19b20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
19b30 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
19b40 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19b50 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
19b60 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
19b70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19b80 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
19b90 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
19ba0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
19bb0 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
19bc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
19bd0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
19be0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
19bf0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
19c00 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
19c10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
19c20 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
19c30 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
19c40 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
19c50 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
19c60 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
19c70 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
19c80 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
19c90 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
19ca0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
19cb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19cc0 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
19cd0 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
19ce0 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
19cf0 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
19d00 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19d10 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
19d20 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
19d30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
19d40 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
19d50 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
19d60 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
19d70 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19da0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
19db0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19dc0 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
19dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19de0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
19df0 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65   of help message
19e00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c  s..**.** The hel
19e10 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  p text for each 
19e20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61  individual comma
19e30 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  nd begins with a
19e40 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74   line that start
19e50 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20  s.** with ".".  
19e60 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73  Subsequent lines
19e70 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61   are supplimenta
19e80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
19e90 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
19ea0 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
19eb0 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68  paces between th
19ec0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d  e end of the com
19ed0 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mand and the.** 
19ee0 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73  start of the des
19ef0 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74  cription of what
19f00 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f   that command do
19f10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
19f20 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c  nst char *(azHel
19f30 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66  p[]) = {.#if def
19f40 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
19f50 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
19f60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19f70 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
19f80 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
19f90 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
19fa0 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20  SQL archives",. 
19fb0 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e   "   Each comman
19fc0 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  d must have exac
19fd0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
19fe0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73  ollowing options
19ff0 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20  :",.  "     -c, 
1a000 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20  --create        
1a010 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
1a020 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20  new archive",.  
1a030 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61  "     -u, --upda
1a040 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
1a050 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70   Add files or up
1a060 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20  date files with 
1a070 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c 0a  changed mtime",.
1a080 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e    "     -i, --in
1a090 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  sert            
1a0a0 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20 61     Like -u but a
1a0b0 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20 69  lways add even i
1a0c0 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67 65  f mtime unchange
1a0d0 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20  d",.  "     -t, 
1a0e0 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  --list          
1a0f0 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74         List cont
1a100 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 22  ents of archive"
1a110 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d  ,.  "     -x, --
1a120 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20  extract         
1a130 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c       Extract fil
1a140 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22  es from archive"
1a150 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c  ,.  "   Optional
1a160 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20   arguments:",.  
1a170 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62  "     -v, --verb
1a180 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1a190 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
1a1a0 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
1a1b0 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20  ocessed",.  "   
1a1c0 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c    -f FILE, --fil
1a1d0 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65  e FILE       Ope
1a1e0 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20  rate on archive 
1a1f0 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73  FILE (default is
1a200 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20   current db)",. 
1a210 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20   "     -a FILE, 
1a220 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20  --append FILE   
1a230 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c    Operate on FIL
1a240 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  E opened using t
1a250 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c  he apndvfs VFS",
1a260 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c  .  "     -C DIR,
1a270 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52   --directory DIR
1a280 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69      Change to di
1a290 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72  rectory DIR to r
1a2a0 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65  ead/extract file
1a2b0 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20  s",.  "     -n, 
1a2c0 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20  --dryrun        
1a2d0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1a2e0 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
1a2f0 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20  ave occurred",. 
1a300 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c   "   Examples:",
1a310 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66  .  "     .ar -cf
1a320 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f   archive.sar foo
1a330 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20 61   bar  # Create a
1a340 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20  rchive.sar from 
1a350 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61  files foo and ba
1a360 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20  r",.  "     .ar 
1a370 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -tf archive.sar 
1a380 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20           # List 
1a390 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69  members of archi
1a3a0 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20  ve.sar",.  "    
1a3b0 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76   .ar -xvf archiv
1a3c0 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23 20  e.sar         # 
1a3d0 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63  Verbosely extrac
1a3e0 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63  t files from arc
1a3f0 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20  hive.sar",.  "  
1a400 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22   See also:",.  "
1a410 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c        http://sql
1a420 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c  ite.org/cli.html
1a430 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73  #sqlar_archive_s
1a440 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a  upport",.#endif.
1a450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a460 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1a470 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46  N.  ".auth ON|OF
1a480 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  F             Sh
1a490 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ow authorizer ca
1a4a0 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66  llbacks",.#endif
1a4b0 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f  .  ".backup ?DB?
1a4c0 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61 63   FILE        Bac
1a4d0 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20  kup DB (default 
1a4e0 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c  \"main\") to FIL
1a4f0 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  E",.  "       --
1a500 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20 20  append          
1a510 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e 64    Use the append
1a520 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20  vfs",.  "       
1a530 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20 20  --async         
1a540 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c      Write to FIL
1a550 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75 72  E without a jour
1a560 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nal and without 
1a570 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61  fsync()",.  ".ba
1a580 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  il on|off       
1a590 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
1a5a0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
1a5b0 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22  r.  Default OFF"
1a5c0 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ,.  ".binary on|
1a5d0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75  off           Tu
1a5e0 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74  rn binary output
1a5f0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66   on or off.  Def
1a600 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63  ault OFF",.  ".c
1a610 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
1a620 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68         Change th
1a630 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
1a640 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59  ory to DIRECTORY
1a650 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f  ",.  ".changes o
1a660 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53  n|off          S
1a670 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  how number of ro
1a680 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51  ws changed by SQ
1a690 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c  L",.  ".check GL
1a6a0 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
1a6b0 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73  Fail if output s
1a6c0 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64  ince .testcase d
1a6d0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a  oes not match",.
1a6e0 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20    ".clone NEWDB 
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e              Clon
1a700 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44  e data into NEWD
1a710 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74  B from the exist
1a720 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
1a730 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20   ".databases    
1a740 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1a750 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
1a760 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
1a770 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f  bases",.  ".dbco
1a780 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20  nfig ?op? ?val? 
1a790 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e      List or chan
1a7a0 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  ge sqlite3_db_co
1a7b0 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c  nfig() options",
1a7c0 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f  .  ".dbinfo ?DB?
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1a7e0 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
1a7f0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
1a800 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75  atabase",.  ".du
1a810 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
1a820 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c        Render all
1a830 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
1a840 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20  t as SQL",.  "  
1a850 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1a860 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72      --preserve-r
1a870 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75  owids      Inclu
1a880 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20  de ROWID values 
1a890 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a  in the output",.
1a8a0 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e    "     --newlin
1a8b0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41  es             A
1a8c0 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e  llow unescaped n
1a8d0 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72  ewline character
1a8e0 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20  s in output",.  
1a8f0 22 20 20 20 54 41 42 4c 45 20 69 73 20 61 20 4c  "   TABLE is a L
1a900 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20  IKE pattern for 
1a910 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75  the tables to du
1a920 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e  mp",.  ".echo on
1a930 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  |off            
1a940 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63   Turn command ec
1a950 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20  ho on or off",. 
1a960 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75   ".eqp on|off|fu
1a970 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c  ll|...     Enabl
1a980 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74  e or disable aut
1a990 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
1a9a0 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20  UERY PLAN",.  " 
1a9b0 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c    Other Modes:",
1a9c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a9d0 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74 65  EBUG.  "      te
1a9e0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1a9f0 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58 50      Show raw EXP
1aa00 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1aa10 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1aa20 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20 20    trace         
1aa30 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66          Like \"f
1aa40 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 65  ull\" but also e
1aa50 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20 76  nable \"PRAGMA v
1aa60 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65  dbe_trace\"",.#e
1aa70 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74 72  ndif.  "      tr
1aa80 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20 20  igger           
1aa90 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c      Like \"full\
1aaa0 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77 20  " but also show 
1aab0 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64 65  trigger bytecode
1aac0 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20  ",.  ".excel    
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1aae0 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75  isplay the outpu
1aaf0 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e  t of next comman
1ab00 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65  d in a spreadshe
1ab10 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43  et",.  ".exit ?C
1ab20 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20 20  ODE?            
1ab30 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
1ab40 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63  am with return-c
1ab50 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65  ode CODE",.  ".e
1ab60 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20  xpert           
1ab70 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e         EXPERIMEN
1ab80 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64  TAL. Suggest ind
1ab90 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69  exes for specifi
1aba0 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20  ed queries",./* 
1abb0 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20  Because explain 
1abc0 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75  mode comes on au
1abd0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c  tomatically now,
1abe0 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20   the ".explain" 
1abf0 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76  mode.** is remov
1ac00 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70  ed from the help
1ac10 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20   screen.  It is 
1ac20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20  still supported 
1ac30 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65  for legacy, howe
1ac40 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61  ver */./*".expla
1ac50 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f  in ?on|off|auto?
1ac60 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20     Turn EXPLAIN 
1ac70 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f  output mode on o
1ac80 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f  r off or to auto
1ac90 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75  matic",*/.  ".fu
1aca0 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65  llschema ?--inde
1acb0 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d  nt?   Show schem
1acc0 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  a and the conten
1acd0 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  t of sqlite_stat
1ace0 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65   tables",.  ".he
1acf0 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20  aders on|off    
1ad00 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c        Turn displ
1ad10 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e  ay of headers on
1ad20 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65   or off",.  ".he
1ad30 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45  lp ?-all? ?PATTE
1ad40 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20  RN?   Show help 
1ad50 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e  text for PATTERN
1ad60 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49  ",.  ".import FI
1ad70 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20 49  LE TABLE       I
1ad80 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
1ad90 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22  FILE into TABLE"
1ada0 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1adb0 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
1adc0 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20  OL.  ".imposter 
1add0 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20 43  INDEX TABLE    C
1ade0 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
1adf0 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e  able TABLE on in
1ae00 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64  dex INDEX",.#end
1ae10 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f  if.  ".indexes ?
1ae20 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53  TABLE?         S
1ae30 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64  how names of ind
1ae40 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20  exes",.  "      
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69 73       If TABLE is
1ae70 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
1ae80 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f   show indexes fo
1ae90 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  r",.  "         
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e    tables matchin
1aec0 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68  g TABLE using th
1aed0 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e  e LIKE operator.
1aee0 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ",.#ifdef SQLITE
1aef0 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
1af00 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45    ".iotrace FILE
1af10 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61 62              Enab
1af20 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69  le I/O diagnosti
1af30 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c  c logging to FIL
1af40 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  E",.#endif.  ".l
1af50 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41  imit ?LIMIT? ?VA
1af60 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f  L?     Display o
1af70 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  r change the val
1af80 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f  ue of an SQLITE_
1af90 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74  LIMIT",.  ".lint
1afa0 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20   OPTIONS        
1afb0 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e      Report poten
1afc0 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75  tial schema issu
1afd0 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70  es.",.  "     Op
1afe0 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1aff0 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
1b000 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
1b010 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
1b020 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20  dexes",.#ifndef 
1b030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1b040 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c  _EXTENSION.  ".l
1b050 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f  oad FILE ?ENTRY?
1b060 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65         Load an e
1b070 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79  xtension library
1b080 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  ",.#endif.  ".lo
1b090 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
1b0a0 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69        Turn loggi
1b0b0 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46  ng on or off.  F
1b0c0 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65 72  ILE can be stder
1b0d0 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d  r/stdout",.  ".m
1b0e0 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f  ode MODE ?TABLE?
1b0f0 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70 75         Set outpu
1b100 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d  t mode",.  "   M
1b110 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c  ODE is one of:",
1b120 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20 20  .  "     ascii  
1b130 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
1b140 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
1b150 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20   and 0x1E",.  " 
1b160 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
1b170 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
1b180 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f  ues",.  "     co
1b190 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
1b1a0 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
1b1b0 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22  ee .width)",.  "
1b1c0 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54       html     HT
1b1d0 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22  ML <table> code"
1b1e0 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72 74  ,.  "     insert
1b1f0 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74     SQL insert st
1b200 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42  atements for TAB
1b210 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e  LE",.  "     lin
1b220 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
1b230 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20  per line",.  "  
1b240 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75     list     Valu
1b250 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  es delimited by 
1b260 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20  \"|\"",.  "     
1b270 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20  quote    Escape 
1b280 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53  answers as for S
1b290 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62  QL",.  "     tab
1b2a0 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61  s     Tab-separa
1b2b0 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ted values",.  "
1b2c0 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43       tcl      TC
1b2d0 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22  L list elements"
1b2e0 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20  ,.  ".nullvalue 
1b2f0 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55 73  STRING        Us
1b300 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
1b310 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
1b320 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c  ",.  ".once (-e|
1b330 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f  -x|FILE)       O
1b340 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65  utput for the ne
1b350 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f  xt SQL command o
1b360 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  nly to FILE",.  
1b370 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65  "     If FILE be
1b380 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68  gins with '|' th
1b390 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70  en open as a pip
1b3a0 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65  e",.  "     Othe
1b3b0 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  r options:",.  "
1b3c0 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76         -e    Inv
1b3d0 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74 20  oke system text 
1b3e0 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20  editor",.  "    
1b3f0 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e     -x    Open in
1b400 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c   a spreadsheet",
1b410 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f  .  ".open ?OPTIO
1b420 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f  NS? ?FILE?   Clo
1b430 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  se existing data
1b440 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20  base and reopen 
1b450 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f  FILE",.  "     O
1b460 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1b470 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20       --append   
1b480 20 20 20 20 20 55 73 65 20 61 70 70 65 6e 64 76       Use appendv
1b490 66 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74  fs to append dat
1b4a0 61 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64  abase to the end
1b4b0 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65   of FILE",.#ifde
1b4c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b4d0 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20  DESERIALIZE.  " 
1b4e0 20 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61         --deseria
1b4f0 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f  lize   Load into
1b500 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73   memory useing s
1b510 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69  qlite3_deseriali
1b520 7a 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20  ze()",.  "      
1b530 20 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20    --hexdb       
1b540 20 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75    Load the outpu
1b550 74 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22  t of \"dbtotxt\"
1b560 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
1b570 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20   database",.  " 
1b580 20 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65         --maxsize
1b590 20 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 73   N     Maximum s
1b5a0 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62 20  ize for --hexdb 
1b5b0 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65  or --deserialize
1b5c0 64 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65 6e  d database",.#en
1b5d0 64 69 66 0a 20 20 22 20 20 20 20 20 20 20 20 2d  dif.  "        -
1b5e0 2d 6e 65 77 20 20 20 20 20 20 20 20 20 20 20 49  -new           I
1b5f0 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74  nitialize FILE t
1b600 6f 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  o an empty datab
1b610 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ase",.  "       
1b620 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20   --readonly     
1b630 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f   Open FILE reado
1b640 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20  nly",.  "       
1b650 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20   --zip          
1b660 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61   FILE is a ZIP a
1b670 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74  rchive",.  ".out
1b680 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20  put ?FILE?      
1b690 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
1b6a0 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f   to FILE or stdo
1b6b0 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d  ut if FILE is om
1b6c0 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20  itted",.  "     
1b6d0 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77  If FILE begins w
1b6e0 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65  ith '|' then ope
1b6f0 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22  n it as a pipe."
1b700 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74 65 72 20  ,.  ".parameter 
1b710 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61  CMD ...       Ma
1b720 6e 61 67 65 20 53 51 4c 20 70 61 72 61 6d 65 74  nage SQL paramet
1b730 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  er bindings",.  
1b740 22 20 20 20 63 6c 65 61 72 20 20 20 20 20 20 20  "   clear       
1b750 20 20 20 20 20 20 20 20 20 20 20 20 45 72 61 73              Eras
1b760 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c  e all bindings",
1b770 0a 20 20 22 20 20 20 69 6e 69 74 20 20 20 20 20  .  "   init     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
1b790 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 54 45  nitialize the TE
1b7a0 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f  MP table that ho
1b7b0 6c 64 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20  lds bindings",. 
1b7c0 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20   "   list       
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1b7e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
1b7f0 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
1b800 22 2c 0a 20 20 22 20 20 20 73 65 74 20 50 41 52  ",.  "   set PAR
1b810 41 4d 45 54 45 52 20 56 41 4c 55 45 20 20 20 20  AMETER VALUE    
1b820 20 47 69 76 65 6e 20 53 51 4c 20 70 61 72 61 6d   Given SQL param
1b830 65 74 65 72 20 50 41 52 41 4d 45 54 45 52 20 61  eter PARAMETER a
1b840 20 76 61 6c 75 65 20 6f 66 20 56 41 4c 55 45 22   value of VALUE"
1b850 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 50 41 52 41 4d 45 54 45 52 20 73 68 6f 75 6c 64  PARAMETER should
1b880 20 73 74 61 72 74 20 77 69 74 68 20 27 24 27 2c   start with '$',
1b890 20 27 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f   ':', '@', or '?
1b8a0 27 22 2c 0a 20 20 22 20 20 20 75 6e 73 65 74 20  '",.  "   unset 
1b8b0 50 41 52 41 4d 45 54 45 52 20 20 20 20 20 20 20  PARAMETER       
1b8c0 20 20 52 65 6d 6f 76 65 20 50 41 52 41 4d 45 54    Remove PARAMET
1b8d0 45 52 20 66 72 6f 6d 20 74 68 65 20 62 69 6e 64  ER from the bind
1b8e0 69 6e 67 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e  ing table",.  ".
1b8f0 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
1b900 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69          Print li
1b910 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23  teral STRING",.#
1b920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b930 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
1b940 42 41 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73  BACK.  ".progres
1b950 73 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  s N             
1b960 20 49 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73 73   Invoke progress
1b970 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 65   handler after e
1b980 76 65 72 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c  very N opcodes",
1b990 0a 20 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e  .  "   --limit N
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 49 6e 74 65 72 72 75 70 74 20 61 66 74 65 72   Interrupt after
1b9c0 20 4e 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c   N progress call
1b9d0 62 61 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d  backs",.  "   --
1b9e0 6f 6e 63 65 20 20 20 20 20 20 20 20 20 20 20 20  once            
1b9f0 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f          Do no mo
1ba00 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67  re than one prog
1ba10 72 65 73 73 20 69 6e 74 65 72 72 75 70 74 22 2c  ress interrupt",
1ba20 0a 20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d  .  "   --quiet|-
1ba30 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q               
1ba40 20 4e 6f 20 6f 75 74 70 75 74 20 65 78 63 65 70   No output excep
1ba50 74 20 61 74 20 69 6e 74 65 72 72 75 70 74 73 22  t at interrupts"
1ba60 2c 0a 20 20 22 20 20 20 2d 2d 72 65 73 65 74 20  ,.  "   --reset 
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e    Reset the coun
1ba90 74 20 66 6f 72 20 65 61 63 68 20 69 6e 70 75 74  t for each input
1baa0 20 61 6e 64 20 69 6e 74 65 72 72 75 70 74 22 2c   and interrupt",
1bab0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d  .#endif.  ".prom
1bac0 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45  pt MAIN CONTINUE
1bad0 20 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20      Replace the 
1bae0 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73  standard prompts
1baf0 22 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20  ",.  ".quit     
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1bb10 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
1bb20 22 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45  ",.  ".read FILE
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1bb40 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 46  ead input from F
1bb50 49 4c 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72  ILE",.  ".restor
1bb60 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  e ?DB? FILE     
1bb70 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e    Restore conten
1bb80 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74  t of DB (default
1bb90 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20   \"main\") from 
1bba0 46 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20  FILE",.  ".save 
1bbb0 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
1bbc0 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f     Write in-memo
1bbd0 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f  ry database into
1bbe0 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e   FILE",.  ".scan
1bbf0 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20  stats on|off    
1bc00 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33      Turn sqlite3
1bc10 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
1bc20 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72  () metrics on or
1bc30 20 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d   off",.  ".schem
1bc40 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20  a ?PATTERN?     
1bc50 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41     Show the CREA
1bc60 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61  TE statements ma
1bc70 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c  tching PATTERN",
1bc80 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
1bc90 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  :",.  "         
1bca0 2d 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20  --indent        
1bcb0 20 20 20 20 54 72 79 20 74 6f 20 70 72 65 74 74      Try to prett
1bcc0 79 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68 65  y-print the sche
1bcd0 6d 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73  ma",.  ".selftes
1bce0 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20  t ?OPTIONS?     
1bcf0 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e   Run tests defin
1bd00 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45  ed in the SELFTE
1bd10 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  ST table",.  "  
1bd20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1bd30 20 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20         --init   
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61              Crea
1bd50 74 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53  te a new SELFTES
1bd60 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  T table",.  "   
1bd70 20 20 20 20 2d 76 20 20 20 20 20 20 20 20 20 20      -v          
1bd80 20 20 20 20 20 20 20 20 20 56 65 72 62 6f 73 65           Verbose
1bd90 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65   output",.  ".se
1bda0 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
1bdb0 3f 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65  ?     Change the
1bdc0 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20   column and row 
1bdd0 73 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66  separators",.#if
1bde0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bdf0 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1be00 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d    ".session ?NAM
1be10 45 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61  E? CMD ...  Crea
1be20 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65  te or control se
1be30 73 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53  ssions",.  "   S
1be40 75 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20  ubcommands:",.  
1be50 22 20 20 20 20 20 61 74 74 61 63 68 20 54 41 42  "     attach TAB
1be60 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41  LE             A
1be70 74 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20  ttach TABLE",.  
1be80 22 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20  "     changeset 
1be90 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57  FILE           W
1bea0 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74  rite a changeset
1beb0 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22   into FILE",.  "
1bec0 20 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20       close      
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c                Cl
1bee0 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22  ose one session"
1bef0 2c 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65  ,.  "     enable
1bf00 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1bf10 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20     Set or query 
1bf20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c  the enable bit",
1bf30 0a 20 20 22 20 20 20 20 20 66 69 6c 74 65 72 20  .  "     filter 
1bf40 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20  GLOB...         
1bf50 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20    Reject tables 
1bf60 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c  matching GLOBs",
1bf70 0a 20 20 22 20 20 20 20 20 69 6e 64 69 72 65 63  .  "     indirec
1bf80 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  t ?BOOLEAN?     
1bf90 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20    Mark or query 
1bfa0 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61  the indirect sta
1bfb0 74 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73  tus",.  "     is
1bfc0 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20  empty           
1bfd0 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65         Query whe
1bfe0 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e  ther the session
1bff0 20 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20   is empty",.  " 
1c000 20 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20      list        
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1c020 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
1c030 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c   session names",
1c040 0a 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42  .  "     open DB
1c050 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
1c060 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73    Open a new ses
1c070 73 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22  sion on DB",.  "
1c080 20 20 20 20 20 70 61 74 63 68 73 65 74 20 46 49       patchset FI
1c090 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72  LE            Wr
1c0a0 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69  ite a patchset i
1c0b0 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20  nto FILE",.  "  
1c0c0 20 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d   If ?NAME? is om
1c0d0 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74  itted, the first
1c0e0 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e   defined session
1c0f0 20 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64   is used.",.#end
1c100 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e  if.  ".sha3sum .
1c110 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 43  ..             C
1c120 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61  ompute a SHA3 ha
1c130 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  sh of database c
1c140 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20  ontent",.  "    
1c150 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1c160 20 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20      --schema    
1c170 20 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68            Also h
1c180 61 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ash the sqlite_m
1c190 61 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20  aster table",.  
1c1a0 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32  "      --sha3-22
1c1b0 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  4            Use
1c1c0 20 74 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c   the sha3-224 al
1c1d0 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1c1e0 20 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20     --sha3-256   
1c1f0 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1c200 20 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69   sha3-256 algori
1c210 74 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74 68  thm.  This is th
1c220 65 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22  e default.",.  "
1c230 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38 34        --sha3-384
1c240 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1c250 74 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c 67  the sha3-384 alg
1c260 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1c270 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20 20    --sha3-512    
1c280 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c290 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69 74  sha3-512 algorit
1c2a0 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79 20  hm",.  "    Any 
1c2b0 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 69  other argument i
1c2c0 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e  s a LIKE pattern
1c2d0 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 68   for tables to h
1c2e0 61 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  ash",.#ifndef SQ
1c2f0 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1c300 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44  EM.  ".shell CMD
1c310 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20 52   ARGS...       R
1c320 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
1c330 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
1c340 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1c350 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
1c360 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63        Show the c
1c370 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1c380 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e  r various settin
1c390 67 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f  gs",.  ".stats ?
1c3a0 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 20  on|off?         
1c3b0 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74   Show stats or t
1c3c0 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20  urn stats on or 
1c3d0 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  off",.#ifndef SQ
1c3e0 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1c3f0 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d  EM.  ".system CM
1c400 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 52  D ARGS...      R
1c410 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
1c420 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
1c430 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61  ",.#endif.  ".ta
1c440 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  bles ?TABLE?    
1c450 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
1c460 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63 68   of tables match
1c470 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e  ing LIKE pattern
1c480 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73   TABLE",.  ".tes
1c490 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20  tcase NAME      
1c4a0 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72       Begin redir
1c4b0 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f  ecting output to
1c4c0 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74   'testcase-out.t
1c4d0 78 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75  xt'",.  ".timeou
1c4e0 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20  t MS            
1c4f0 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f    Try opening lo
1c500 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20  cked tables for 
1c510 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22  MS milliseconds"
1c520 2c 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f  ,.  ".timer on|o
1c530 66 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75  ff            Tu
1c540 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20  rn SQL timer on 
1c550 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66  or off",.#ifndef
1c560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1c570 43 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50  CE.  ".trace ?OP
1c580 54 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f  TIONS?         O
1c590 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73  utput each SQL s
1c5a0 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69  tatement as it i
1c5b0 73 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46  s run",.  "    F
1c5c0 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1c5d0 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70         Send outp
1c5e0 75 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ut to FILE",.  "
1c5f0 20 20 20 20 73 74 64 6f 75 74 20 20 20 20 20 20      stdout      
1c600 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64              Send
1c610 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75   output to stdou
1c620 74 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72  t",.  "    stder
1c630 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c640 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
1c650 6f 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20  o stderr",.  "  
1c660 20 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20    off           
1c670 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c            Disabl
1c680 65 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20  e tracing",.  " 
1c690 20 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20     --expanded   
1c6a0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 61 6e             Expan
1c6b0 64 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  d query paramete
1c6c0 72 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  rs",.#ifdef SQLI
1c6d0 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c  TE_ENABLE_NORMAL
1c6e0 49 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72  IZE.  "    --nor
1c6f0 6d 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20  malized         
1c700 20 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51     Normal the SQ
1c710 4c 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23  L statements",.#
1c720 65 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70  endif.  "    --p
1c730 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
1c740 20 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73       Show SQL as
1c750 20 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20   it is input",. 
1c760 20 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20   "    --stmt    
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1c780 61 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78  ace statement ex
1c790 65 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f  ecution (SQLITE_
1c7a0 54 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20  TRACE_STMT)",.  
1c7b0 22 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20  "    --profile  
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f               Pro
1c7d0 66 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20  file statements 
1c7e0 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52  (SQLITE_TRACE_PR
1c7f0 4f 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20  OFILE)",.  "    
1c800 2d 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20 20  --row           
1c810 20 20 20 20 20 20 20 20 54 72 61 63 65 20 65 61          Trace ea
1c820 63 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54  ch row (SQLITE_T
1c830 52 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20  RACE_ROW)",.  " 
1c840 20 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20     --close      
1c850 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1c860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73   connection clos
1c870 65 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e (SQLITE_TRACE_
1c880 43 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20  CLOSE)",.#endif 
1c890 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
1c8a0 52 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69  RACE */.  ".vfsi
1c8b0 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20  nfo ?AUX?       
1c8c0 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20      Information 
1c8d0 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65  about the top-le
1c8e0 76 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66  vel VFS",.  ".vf
1c8f0 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
1c900 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61        List all a
1c910 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c  vailable VFSes",
1c920 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55  .  ".vfsname ?AU
1c930 58 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69  X?           Pri
1c940 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nt the name of t
1c950 68 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20  he VFS stack",. 
1c960 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55   ".width NUM1 NU
1c970 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63  M2 ...     Set c
1c980 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72  olumn widths for
1c990 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65   \"column\" mode
1c9a0 22 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74  ",.  "     Negat
1c9b0 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74  ive values right
1c9c0 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f  -justify",.};../
1c9d0 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70  *.** Output help
1c9e0 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61   text..**.** zPa
1c9f0 74 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20  ttern describes 
1ca00 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61  the set of comma
1ca10 6e 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65  nds for which he
1ca20 6c 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69  lp text is provi
1ca30 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74  ded..** If zPatt
1ca40 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ern is NULL, the
1ca50 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61  n show all comma
1ca60 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69  nds, but only gi
1ca70 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a  ve a one-line.**
1ca80 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
1ca90 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  each..**.** Retu
1caa0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cab0 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
1cac0 74 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70  tic int showHelp
1cad0 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
1cae0 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
1caf0 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1cb00 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69    int j = 0;.  i
1cb10 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  nt n = 0;.  char
1cb20 20 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50   *zPat;.  if( zP
1cb30 61 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20  attern==0.   || 
1cb40 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27  zPattern[0]=='0'
1cb50 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50  .   || strcmp(zP
1cb60 61 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a  attern,"-a")==0.
1cb70 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1cb80 74 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30  ttern,"-all")==0
1cb90 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f  .  ){.    /* Sho
1cba0 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20  w all commands, 
1cbb0 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e  but only one lin
1cbc0 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f  e per command */
1cbd0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72  .    if( zPatter
1cbe0 6e 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20  n==0 ) zPattern 
1cbf0 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
1cc00 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1cc10 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  zHelp); i++){.  
1cc20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69      if( azHelp[i
1cc30 5d 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61  ][0]=='.' || zPa
1cc40 74 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ttern[0] ){.    
1cc50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1cc60 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1cc70 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  elp[i]);.       
1cc80 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
1cc90 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1cca0 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d   /* Look for com
1ccb0 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77  mands that for w
1ccc0 68 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73  hich zPattern is
1ccd0 20 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78   an exact prefix
1cce0 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73   */.    zPat = s
1ccf0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1cd00 2e 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29  .%s*", zPattern)
1cd10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1cd20 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1cd30 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
1cd40 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
1cd50 6c 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70  lob(zPat, azHelp
1cd60 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1cd70 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1cd80 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1cd90 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1cda0 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  j = i+1;.       
1cdb0 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
1cdc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1cdd0 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20  free(zPat);.    
1cde0 69 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69  if( n ){.      i
1cdf0 66 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  f( n==1 ){.     
1ce00 20 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74     /* when zPatt
1ce10 65 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20  ern is a prefix 
1ce20 6f 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  of exactly one c
1ce30 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63  ommand, then inc
1ce40 6c 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20  lude the.       
1ce50 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74   ** details of t
1ce60 68 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69  hat command, whi
1ce70 63 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20  ch should begin 
1ce80 61 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20  at offset j */. 
1ce90 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c         while( j<
1cea0 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1ceb0 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d  )-1 && azHelp[j]
1cec0 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]!='.' ){.    
1ced0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1cee0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61  f(out, "%s\n", a
1cef0 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20  zHelp[j]);.     
1cf00 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1cf10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cf20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20    return n;.    
1cf30 7d 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  }.    /* Look fo
1cf40 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  r commands that 
1cf50 63 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e  contain zPattern
1cf60 20 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77   anywhere.  Show
1cf70 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20   the complete.  
1cf80 20 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c    ** text of all
1cf90 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d   commands that m
1cfa0 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61  atch. */.    zPa
1cfb0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
1cfc0 6e 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50  ntf("%%%s%%", zP
1cfd0 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72  attern);.    for
1cfe0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1cff0 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b  e(azHelp); i++){
1d000 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c  .      if( azHel
1d010 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a  p[i][0]=='.' ) j
1d020 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
1d030 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1d040 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c  zPat, azHelp[i],
1d050 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
1d060 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1d070 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1d080 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77  p[j]);.        w
1d090 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a  hile( j<ArraySiz
1d0a0 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61  e(azHelp)-1 && a
1d0b0 7a 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27  zHelp[j+1][0]!='
1d0c0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
1d0d0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75  j++;.          u
1d0e0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1d0f0 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1d100 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
1d110 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20        i = j;.   
1d120 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
1d130 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1d140 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a  te3_free(zPat);.
1d150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
1d160 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1d170 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
1d180 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e  c int process_in
1d190 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  put(ShellState *
1d1a0 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  p);../*.** Read 
1d1b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
1d1c0 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
1d1d0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1d1e0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1d1f0 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
1d200 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d210 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1d220 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1d230 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
1d240 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
1d250 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
1d260 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
1d270 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
1d280 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
1d290 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1d2a0 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
1d2b0 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
1d2c0 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
1d2d0 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
1d2e0 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1d2f0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
1d300 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
1d310 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
1d320 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
1d330 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
1d340 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
1d350 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
1d360 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
1d370 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
1d380 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1d390 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
1d3a0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
1d3b0 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1d3c0 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
1d3d0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1d3e0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1d3f0 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
1d400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d410 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
1d420 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
1d430 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1d440 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
1d450 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
1d460 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
1d470 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
1d480 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
1d490 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1d4a0 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1d4b0 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1d4c0 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
1d4d0 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
1d4e0 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
1d4f0 29 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72  ){ fclose(in); r
1d500 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65  eturn 0; }.  nRe
1d510 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c  ad = fread(pBuf,
1d520 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20   nIn, 1, in);.  
1d530 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66  fclose(in);.  if
1d540 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20  ( nRead!=1 ){.  
1d550 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d560 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Buf);.    return
1d570 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e   0;.  }.  pBuf[n
1d580 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  In] = 0;.  if( p
1d590 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20  nByte ) *pnByte 
1d5a0 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20  = nIn;.  return 
1d5b0 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  pBuf;.}..#if def
1d5c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d5d0 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
1d5e0 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65  * Close a single
1d5f0 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
1d600 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ect and release 
1d610 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63  all of its assoc
1d620 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63  iated.** resourc
1d630 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1d640 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1d650 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53  (OpenSession *pS
1d660 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69  ession){.  int i
1d670 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69  ;.  sqlite3sessi
1d680 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69  on_delete(pSessi
1d690 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65  on->p);.  sqlite
1d6a0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1d6b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  >zName);.  for(i
1d6c0 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
1d6d0 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
1d6e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d6f0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1d700 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  er[i]);.  }.  sq
1d710 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1d720 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a  ion->azFilter);.
1d730 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f    memset(pSessio
1d740 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65  n, 0, sizeof(Ope
1d750 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65  nSession));.}.#e
1d760 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
1d770 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f  e all OpenSessio
1d780 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65  n objects and re
1d790 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69  lease all associ
1d7a0 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a  ated resources..
1d7b0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1d7c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1d7d0 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69  SION).static voi
1d7e0 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f  d session_close_
1d7f0 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  all(ShellState *
1d800 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  p){.  int i;.  f
1d810 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65  or(i=0; i<p->nSe
1d820 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ssion; i++){.   
1d830 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26   session_close(&
1d840 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b  p->aSession[i]);
1d850 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69  .  }.  p->nSessi
1d860 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  on = 0;.}.#else.
1d870 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e  # define session
1d880 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65  _close_all(X).#e
1d890 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ndif../*.** Impl
1d8a0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1d8b0 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69  e xFilter functi
1d8c0 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73  on for an open s
1d8d0 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a  ession.  Omit.**
1d8e0 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65   any tables name
1d8f0 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66  d by ".session f
1d900 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61  ilter" but let a
1d910 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74  ll other table t
1d920 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64  hrough..*/.#if d
1d930 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d940 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74  ABLE_SESSION).st
1d950 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
1d960 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43  _filter(void *pC
1d970 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tx, const char *
1d980 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73  zTab){.  OpenSes
1d990 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d  sion *pSession =
1d9a0 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70   (OpenSession*)p
1d9b0 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Ctx;.  int i;.  
1d9c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73  for(i=0; i<pSess
1d9d0 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b  ion->nFilter; i+
1d9e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1d9f0 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73  te3_strglob(pSes
1da00 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
1da10 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65  ], zTab)==0 ) re
1da20 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1da30 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1da40 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
1da50 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f  educe the type o
1da60 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65  f file for zName
1da70 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f   based on its co
1da80 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ntent.  Return.*
1da90 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45  * one of the SHE
1daa0 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61  LL_OPEN_* consta
1dab0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nts..**.** If th
1dac0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1dad0 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74  exist or is empt
1dae0 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c  y but its name l
1daf0 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a  ooks like a ZIP.
1db00 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74  ** archive and t
1db10 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20  he dfltZip flag 
1db20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73  is true, then as
1db30 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50  sume it is a ZIP
1db40 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68   archive..** Oth
1db50 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61  erwise, assume a
1db60 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62  n ordinary datab
1db70 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ase regardless o
1db80 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69  f the filename i
1db90 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61  f.** the type ca
1dba0 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e  nnot be determin
1dbb0 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e  ed from content.
1dbc0 0a 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61  .*/.int deduceDa
1dbd0 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74  tabaseType(const
1dbe0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1dbf0 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49  t dfltZip){.  FI
1dc00 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e  LE *f = fopen(zN
1dc10 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69  ame, "rb");.  si
1dc20 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63  ze_t n;.  int rc
1dc30 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
1dc40 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75  SPEC;.  char zBu
1dc50 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d  f[100];.  if( f=
1dc60 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66  =0 ){.    if( df
1dc70 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33  ltZip && sqlite3
1dc80 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22  _strlike("%.zip"
1dc90 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a  ,zName,0)==0 ){.
1dca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48         return SH
1dcb0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1dcc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dcd0 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1dce0 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1dcf0 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72    }.  }.  n = fr
1dd00 65 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c  ead(zBuf, 16, 1,
1dd10 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1dd20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1dd30 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33  "SQLite format 3
1dd40 22 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 16)==0 ){.   
1dd50 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20   fclose(f);.    
1dd60 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45  return SHELL_OPE
1dd70 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  N_NORMAL;.  }.  
1dd80 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45  fseek(f, -25, SE
1dd90 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66  EK_END);.  n = f
1dda0 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31  read(zBuf, 25, 1
1ddb0 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31  , f);.  if( n==1
1ddc0 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   && memcmp(zBuf,
1ddd0 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74   "Start-Of-SQLit
1dde0 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  e3-", 17)==0 ){.
1ddf0 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1de00 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20  PEN_APPENDVFS;. 
1de10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65   }else{.    fsee
1de20 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45  k(f, -22, SEEK_E
1de30 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  ND);.    n = fre
1de40 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20  ad(zBuf, 22, 1, 
1de50 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31  f);.    if( n==1
1de60 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35   && zBuf[0]==0x5
1de70 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78  0 && zBuf[1]==0x
1de80 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30  4b && zBuf[2]==0
1de90 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42  x05.       && zB
1dea0 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20  uf[3]==0x06 ){. 
1deb0 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f       rc = SHELL_
1dec0 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20  OPEN_ZIPFILE;.  
1ded0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30    }else if( n==0
1dee0 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73   && dfltZip && s
1def0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
1df00 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d  %.zip",zName,0)=
1df10 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1df20 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1df30 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ILE;.    }.  }. 
1df40 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65   fclose(f);.  re
1df50 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69  turn rc;  .}..#i
1df60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1df70 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f  LE_DESERIALIZE./
1df80 2a 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74  *.** Reconstruct
1df90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1dfa0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1dfb0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65   output from the
1dfc0 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72   "dbtotxt".** pr
1dfd0 6f 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e  ogram.  Read con
1dfe0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69  tent from the fi
1dff0 6c 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65  le in p->zDbFile
1e000 6e 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62  name.  If p->zDb
1e010 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30  Filename.** is 0
1e020 2c 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d  , then read from
1e030 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
1e040 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
1e050 6e 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65  ned char *readHe
1e060 78 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  xDb(ShellState *
1e070 70 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b  p, int *pnData){
1e080 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e090 20 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e   *a = 0;.  int n
1e0a0 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Line;.  int n = 
1e0b0 30 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  0;.  int pgsz = 
1e0c0 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
1e0d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b   = 0;.  int j, k
1e0e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49  ;.  int rc;.  FI
1e0f0 4c 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e  LE *in;.  unsign
1e100 65 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20  ed int x[16];.  
1e110 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
1e120 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69  ;.  if( p->zDbFi
1e130 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  lename ){.    in
1e140 20 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46   = fopen(p->zDbF
1e150 69 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20  ilename, "r");. 
1e160 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
1e170 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1e180 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
1e190 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
1e1a0 72 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d  r reading\n", p-
1e1b0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  >zDbFilename);. 
1e1c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e1d0 20 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d     }.    nLine =
1e1e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1e1f0 20 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20   in = p->in;.   
1e200 20 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65   nLine = p->line
1e210 6e 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74  no;.  }.  *pnDat
1e220 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b  a = 0;.  nLine++
1e230 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c  ;.  if( fgets(zL
1e240 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
1e250 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74  e), in)==0 ) got
1e260 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e270 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66  r;.  rc = sscanf
1e280 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20  (zLine, "| size 
1e290 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c  %d pagesize %d",
1e2a0 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69   &n, &pgsz);.  i
1e2b0 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20  f( rc!=2 ) goto 
1e2c0 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b  readHexDb_error;
1e2d0 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f  .  if( n<=0 ) go
1e2e0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e2f0 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65  or;.  a = sqlite
1e300 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  3_malloc( n );. 
1e310 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1e320 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e330 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d  err, "Out of mem
1e340 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  ory!\n");.    go
1e350 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e360 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  or;.  }.  memset
1e370 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28  (a, 0, n);.  if(
1e380 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
1e390 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a  z>65536 || (pgsz
1e3a0 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20   & (pgsz-1))!=0 
1e3b0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1e3c0 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61  tf(stderr, "inva
1e3d0 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29  lid pagesize\n")
1e3e0 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e3f0 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e400 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66    for(nLine++; f
1e410 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1e420 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d  of(zLine), in)!=
1e430 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20  0; nLine++){.   
1e440 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1e450 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f  ne, "| page %d o
1e460 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26  ffset %d", &j, &
1e470 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  k);.    if( rc==
1e480 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73  2 ){.      iOffs
1e490 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f  et = k;.      co
1e4a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e4b0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c    if( strncmp(zL
1e4c0 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36  ine, "| end ", 6
1e4d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  )==0 ){.      br
1e4e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1e4f0 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
1e500 2c 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78  ,"| %d: %x %x %x
1e510 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e520 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e530 78 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20  x %x %x",.      
1e540 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78            &j, &x
1e550 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32  [0], &x[1], &x[2
1e560 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c  ], &x[3], &x[4],
1e570 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26   &x[5], &x[6], &
1e580 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  x[7],.          
1e590 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b        &x[8], &x[
1e5a0 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31  9], &x[10], &x[1
1e5b0 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31  1], &x[12], &x[1
1e5c0 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31  3], &x[14], &x[1
1e5d0 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  5]);.    if( rc=
1e5e0 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d  =17 ){.      k =
1e5f0 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20   iOffset+j;.    
1e600 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b    if( k+16<=n ){
1e610 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
1e620 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1e630 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20  0; ii<16; ii++) 
1e640 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26  a[k+ii] = x[ii]&
1e650 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0xff;.      }.  
1e660 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74    }.  }.  *pnDat
1e670 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21  a = n;.  if( in!
1e680 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63  =p->in ){.    fc
1e690 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73  lose(in);.  }els
1e6a0 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f  e{.    p->lineno
1e6b0 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1e6c0 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48  return a;..readH
1e6d0 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66  exDb_error:.  if
1e6e0 28 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20  ( in!=stdin ){. 
1e6f0 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1e700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1e710 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  e( fgets(zLine, 
1e720 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70  sizeof(zLine), p
1e730 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  ->in)!=0 ){.    
1e740 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
1e750 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e   if(strncmp(zLin
1e760 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
1e770 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1e780 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  }.    p->lineno 
1e790 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73  = nLine;.  }.  s
1e7a0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1e7b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e7c0 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c  derr,"Error on l
1e7d0 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64  ine %d of --hexd
1e7e0 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e  b input\n", nLin
1e7f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  e);.  return 0;.
1e800 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e810 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1e820 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALIZE */../*.** 
1e830 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  Scalar function 
1e840 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2e 20 54  "shell_int32". T
1e850 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e860 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1e870 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 20  on.** must be a 
1e880 62 6c 6f 62 2e 20 54 68 65 20 73 65 63 6f 6e 64  blob. The second
1e890 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
1e8a0 69 6e 74 65 67 65 72 2e 20 54 68 69 73 20 66 75  integer. This fu
1e8b0 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 61 64 73 20  nction.** reads 
1e8c0 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 33 32  and returns a 32
1e8d0 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
1e8e0 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 79 74  integer from byt
1e8f0 65 0a 2a 2a 20 6f 66 66 73 65 74 20 28 34 2a 3c  e.** offset (4*<
1e900 61 72 67 32 3e 29 20 6f 66 20 74 68 65 20 62 6c  arg2>) of the bl
1e910 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ob..*/.static vo
1e920 69 64 20 73 68 65 6c 6c 49 6e 74 33 32 28 0a 20  id shellInt32(. 
1e930 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1e940 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
1e950 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
1e960 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1e970 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1e980 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b  ned char *pBlob;
1e990 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20  .  int nBlob;.  
1e9a0 69 6e 74 20 69 49 6e 74 3b 0a 20 20 0a 20 20 6e  int iInt;.  .  n
1e9b0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
1e9c0 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1e9d0 30 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28  0]);.  pBlob = (
1e9e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e9f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1ea00 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
1ea10 3b 0a 20 20 69 49 6e 74 20 3d 20 73 71 6c 69 74  ;.  iInt = sqlit
1ea20 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
1ea30 76 5b 31 5d 29 3b 0a 0a 20 20 69 66 28 20 69 49  v[1]);..  if( iI
1ea40 6e 74 3e 3d 30 20 26 26 20 28 69 49 6e 74 2b 31  nt>=0 && (iInt+1
1ea50 29 2a 34 3c 3d 6e 42 6c 6f 62 20 29 7b 0a 20 20  )*4<=nBlob ){.  
1ea60 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1ea70 20 63 68 61 72 20 2a 61 20 3d 20 26 70 42 6c 6f   char *a = &pBlo
1ea80 62 5b 69 49 6e 74 2a 34 5d 3b 0a 20 20 20 20 73  b[iInt*4];.    s
1ea90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
1eaa0 6c 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  l = ((sqlite3_in
1eab0 74 36 34 29 61 5b 30 5d 3c 3c 32 34 29 0a 20 20  t64)a[0]<<24).  
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33       + ((sqlite3
1eae0 5f 69 6e 74 36 34 29 61 5b 31 5d 3c 3c 31 36 29  _int64)a[1]<<16)
1eaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb00 20 20 20 20 20 20 20 20 2b 20 28 28 73 71 6c 69          + ((sqli
1eb10 74 65 33 5f 69 6e 74 36 34 29 61 5b 32 5d 3c 3c  te3_int64)a[2]<<
1eb20 20 38 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   8).            
1eb30 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 73             + ((s
1eb40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 33  qlite3_int64)a[3
1eb50 5d 3c 3c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ]<< 0);.    sqli
1eb60 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
1eb70 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b  (context, iVal);
1eb80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
1eb90 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73  alar function "s
1eba0 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
1ebb0 22 20 75 73 65 64 20 62 79 20 74 68 65 20 2e 72  " used by the .r
1ebc0 65 63 6f 76 65 72 20 63 6f 6d 6d 61 6e 64 2e 0a  ecover command..
1ebd0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
1ebe0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1ebf0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6f  unction is the o
1ec00 75 74 70 75 74 20 6f 66 20 62 75 69 6c 74 2d 69  utput of built-i
1ec10 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 71 75  n.** function qu
1ec20 6f 74 65 28 29 2e 20 49 66 20 74 68 65 20 66 69  ote(). If the fi
1ec30 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1ec40 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 22 27   the input is "'
1ec50 22 2c 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  ", .** indicatin
1ec60 67 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  g that the value
1ec70 20 70 61 73 73 65 64 20 74 6f 20 71 75 6f 74 65   passed to quote
1ec80 28 29 20 77 61 73 20 61 20 74 65 78 74 20 76 61  () was a text va
1ec90 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  lue,.** then thi
1eca0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
1ecb0 68 65 73 20 74 68 65 20 69 6e 70 75 74 20 66 6f  hes the input fo
1ecc0 72 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20  r "\n" and "\r" 
1ecd0 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 61 6e  characters.** an
1ece0 64 20 61 64 64 73 20 61 20 77 72 61 70 70 65 72  d adds a wrapper
1ecf0 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
1ed00 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1ed10 20 20 20 72 65 70 6c 61 63 65 28 72 65 70 6c 61     replace(repla
1ed20 63 65 28 3c 69 6e 70 75 74 3e 2c 20 27 5c 6e 27  ce(<input>, '\n'
1ed30 2c 20 63 68 61 72 28 31 30 29 2c 20 27 5c 72 27  , char(10), '\r'
1ed40 2c 20 63 68 61 72 28 31 33 29 29 3b 0a 2a 2a 0a  , char(13));.**.
1ed50 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69  ** Or, if the fi
1ed60 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1ed70 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
1ed80 74 20 22 27 22 2c 20 74 68 65 6e 20 61 20 63 6f  t "'", then a co
1ed90 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70  py.** of the inp
1eda0 75 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ut is returned..
1edb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1edc0 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 28 0a  hellEscapeCrnl(.
1edd0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1ede0 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
1edf0 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
1ee00 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1ee10 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1ee20 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
1ee30 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1ee40 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1ee50 5d 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 5b  ]);.  if( zText[
1ee60 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  0]=='\'' ){.    
1ee70 69 6e 74 20 6e 54 65 78 74 20 3d 20 73 71 6c 69  int nText = sqli
1ee80 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1ee90 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6e  argv[0]);.    in
1eea0 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  t i;.    char zB
1eeb0 75 66 31 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61  uf1[20];.    cha
1eec0 72 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20  r zBuf2[20];.   
1eed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c   const char *zNL
1eee0 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
1eef0 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20  char *zCR = 0;. 
1ef00 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a     int nCR = 0;.
1ef10 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b      int nNL = 0;
1ef20 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ..    for(i=0; z
1ef30 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Text[i]; i++){. 
1ef40 20 20 20 20 20 69 66 28 20 7a 4e 4c 3d 3d 30 20       if( zNL==0 
1ef50 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e  && zText[i]=='\n
1ef60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 4c  ' ){.        zNL
1ef70 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67   = unused_string
1ef80 28 7a 54 65 78 74 2c 20 22 5c 5c 6e 22 2c 20 22  (zText, "\\n", "
1ef90 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a  \\012", zBuf1);.
1efa0 20 20 20 20 20 20 20 20 6e 4e 4c 20 3d 20 28 69          nNL = (i
1efb0 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 4c 29 3b 0a  nt)strlen(zNL);.
1efc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1efd0 28 20 7a 43 52 3d 3d 30 20 26 26 20 7a 54 65 78  ( zCR==0 && zTex
1efe0 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20  t[i]=='\r' ){.  
1eff0 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73        zCR = unus
1f000 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74 2c  ed_string(zText,
1f010 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c   "\\r", "\\015",
1f020 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 20 20 20   zBuf2);.       
1f030 20 6e 43 52 20 3d 20 28 69 6e 74 29 73 74 72 6c   nCR = (int)strl
1f040 65 6e 28 7a 43 52 29 3b 0a 20 20 20 20 20 20 7d  en(zCR);.      }
1f050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f060 7a 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a 20 20  zNL || zCR ){.  
1f070 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
1f080 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 4d 61 78  ;.      i64 nMax
1f090 20 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52 29 20 3f   = (nNL > nCR) ?
1f0a0 20 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20 20 20   nNL : nCR;.    
1f0b0 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 6e    i64 nAlloc = n
1f0c0 4d 61 78 20 2a 20 6e 54 65 78 74 20 2b 20 28 6e  Max * nText + (n
1f0d0 4d 61 78 2b 31 32 29 2a 32 3b 0a 20 20 20 20 20  Max+12)*2;.     
1f0e0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63   char *zOut = (c
1f0f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  har*)sqlite3_mal
1f100 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20  loc64(nAlloc);. 
1f110 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30       if( zOut==0
1f120 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f130 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1f140 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
1f150 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
1f160 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f170 69 66 28 20 7a 4e 4c 20 26 26 20 7a 43 52 20 29  if( zNL && zCR )
1f180 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1f190 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72  (&zOut[iOut], "r
1f1a0 65 70 6c 61 63 65 28 72 65 70 6c 61 63 65 28 22  eplace(replace("
1f1b0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69  , 16);.        i
1f1c0 4f 75 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20  Out += 16;.     
1f1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f1e0 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f1f0 74 5d 2c 20 22 72 65 70 6c 61 63 65 28 22 2c 20  t], "replace(", 
1f200 38 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 75 74  8);.        iOut
1f210 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20   += 8;.      }. 
1f220 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54       for(i=0; zT
1f230 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ext[i]; i++){.  
1f240 20 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b        if( zText[
1f250 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  i]=='\n' ){.    
1f260 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
1f270 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e  ut[iOut], zNL, n
1f280 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  NL);.          i
1f290 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20  Out += nNL;.    
1f2a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
1f2b0 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a  ext[i]=='\r' ){.
1f2c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f2d0 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43  (&zOut[iOut], zC
1f2e0 52 2c 20 6e 43 52 29 3b 0a 20 20 20 20 20 20 20  R, nCR);.       
1f2f0 20 20 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a     iOut += nCR;.
1f300 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f310 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 4f           zOut[iO
1f320 75 74 5d 20 3d 20 7a 54 65 78 74 5b 69 5d 3b 0a  ut] = zText[i];.
1f330 20 20 20 20 20 20 20 20 20 20 69 4f 75 74 2b 2b            iOut++
1f340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f350 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a    }..      if( z
1f360 4e 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  NL ){.        me
1f370 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f380 2c 20 22 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74  , ",'", 2); iOut
1f390 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6d   += 2;.        m
1f3a0 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74  emcpy(&zOut[iOut
1f3b0 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20 69 4f  ], zNL, nNL); iO
1f3c0 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20  ut += nNL;.     
1f3d0 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f3e0 69 4f 75 74 5d 2c 20 22 27 2c 20 63 68 61 72 28  iOut], "', char(
1f3f0 31 30 29 29 22 2c 20 31 32 29 3b 20 69 4f 75 74  10))", 12); iOut
1f400 20 2b 3d 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a   += 12;.      }.
1f410 20 20 20 20 20 20 69 66 28 20 7a 43 52 20 29 7b        if( zCR ){
1f420 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f430 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27  &zOut[iOut], ",'
1f440 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32  ", 2); iOut += 2
1f450 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1f460 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43  (&zOut[iOut], zC
1f470 52 2c 20 6e 43 52 29 3b 20 69 4f 75 74 20 2b 3d  R, nCR); iOut +=
1f480 20 6e 43 52 3b 0a 20 20 20 20 20 20 20 20 6d 65   nCR;.        me
1f490 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f4a0 2c 20 22 27 2c 20 63 68 61 72 28 31 33 29 29 22  , "', char(13))"
1f4b0 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31  , 12); iOut += 1
1f4c0 32 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  2;.      }..    
1f4d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f4e0 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1f4f0 4f 75 74 2c 20 69 4f 75 74 2c 20 53 51 4c 49 54  Out, iOut, SQLIT
1f500 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
1f510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f520 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
1f530 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1f540 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1f550 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
1f560 20 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a   argv[0]);.}../*
1f570 20 46 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f   Flags for open_
1f580 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  db()..**.** The 
1f590 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72  default behavior
1f5a0 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20 69 73   of open_db() is
1f5b0 20 74 6f 20 65 78 69 74 28 31 29 20 69 66 20 74   to exit(1) if t
1f5c0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c  he database fail
1f5d0 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54  s to.** open.  T
1f5e0 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41  he OPEN_DB_KEEPA
1f5f0 4c 49 56 45 20 66 6c 61 67 20 63 68 61 6e 67 65  LIVE flag change
1f600 73 20 74 68 61 74 20 73 6f 20 74 68 61 74 20 69  s that so that i
1f610 74 20 70 72 69 6e 74 73 20 61 6e 20 65 72 72 6f  t prints an erro
1f620 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20 72  r.** but still r
1f630 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 63  eturns without c
1f640 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a  alling exit..**.
1f650 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a  ** The OPEN_DB_Z
1f660 49 50 46 49 4c 45 20 66 6c 61 67 20 63 61 75 73  IPFILE flag caus
1f670 65 73 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20  es open_db() to 
1f680 70 72 65 66 65 72 20 74 6f 20 6f 70 65 6e 20 66  prefer to open f
1f690 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50  iles as a.** ZIP
1f6a0 20 61 72 63 68 69 76 65 20 69 66 20 74 68 65 20   archive if the 
1f6b0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
1f6c0 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20  ist or is empty 
1f6d0 61 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d 61 74  and its name mat
1f6e0 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69  ches.** the *.zi
1f6f0 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64  p pattern..*/.#d
1f700 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45  efine OPEN_DB_KE
1f710 45 50 41 4c 49 56 45 20 20 20 30 78 30 30 31 20  EPALIVE   0x001 
1f720 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 66 74 65    /* Return afte
1f730 72 20 65 72 72 6f 72 20 69 66 20 74 72 75 65 20  r error if true 
1f740 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f  */.#define OPEN_
1f750 44 42 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 30  DB_ZIPFILE     0
1f760 78 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61  x002   /* Open a
1f770 73 20 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d 61  s ZIP if name ma
1f780 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a  tches *.zip */..
1f790 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1f7a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f7b0 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
1f7c0 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
1f7d0 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
1f7e0 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
1f7f0 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
1f800 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
1f810 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
1f820 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68   void open_db(Sh
1f830 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1f840 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69   openFlags){.  i
1f850 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
1f860 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f     if( p->openMo
1f870 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  de==SHELL_OPEN_U
1f880 4e 53 50 45 43 20 29 7b 0a 20 20 20 20 20 20 69  NSPEC ){.      i
1f890 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  f( p->zDbFilenam
1f8a0 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69  e==0 || p->zDbFi
1f8b0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a  lename[0]==0 ){.
1f8c0 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
1f8d0 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
1f8e0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d  _NORMAL;.      }
1f8f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
1f900 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29  >openMode = (u8)
1f910 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79  deduceDatabaseTy
1f920 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  pe(p->zDbFilenam
1f930 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50   (openFlags & OP
1f960 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d  EN_DB_ZIPFILE)!=
1f970 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f980 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d  }.    switch( p-
1f990 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20  >openMode ){.   
1f9a0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1f9b0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a  EN_APPENDVFS: {.
1f9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f9d0 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69  open_v2(p->zDbFi
1f9e0 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20  lename, &p->db, 
1f9f0 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  .           SQLI
1fa00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1fa10 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
1fa20 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29  EATE, "apndvfs")
1fa30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1fa40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1fa50 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48  ase SHELL_OPEN_H
1fa60 45 58 44 42 3a 0a 20 20 20 20 20 20 63 61 73 65  EXDB:.      case
1fa70 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45   SHELL_OPEN_DESE
1fa80 52 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20  RIALIZE: {.     
1fa90 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1faa0 30 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  0, &p->db);.    
1fab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fac0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1fad0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1fae0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1faf0 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
1fb00 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  y:", &p->db);.  
1fb10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fb20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1fb30 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
1fb40 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  NLY: {.        s
1fb50 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70  qlite3_open_v2(p
1fb60 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26  ->zDbFilename, &
1fb70 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  p->db, SQLITE_OP
1fb80 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b  EN_READONLY, 0);
1fb90 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1fba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1fbb0 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  se SHELL_OPEN_UN
1fbc0 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65  SPEC:.      case
1fbd0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1fbe0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AL: {.        sq
1fbf0 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
1fc00 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
1fc10 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  b);.        brea
1fc20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fc30 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20  .    globalDb = 
1fc40 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70  p->db;.    if( p
1fc50 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  ->db==0 || SQLIT
1fc60 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
1fc70 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a  rcode(p->db) ){.
1fc80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1fc90 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1fca0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
1fcb0 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a  database \"%s\":
1fcc0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1fcd0 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
1fce0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1fcf0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1fd00 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26 20  if( openFlags & 
1fd10 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1fd20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E ){.        sql
1fd30 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f  ite3_open(":memo
1fd40 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  ry:", &p->db);. 
1fd50 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
1fd60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 69       }.      exi
1fd70 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
1fd80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fd90 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
1fda0 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
1fdb0 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
1fdc0 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
1fdd0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  if.    sqlite3_f
1fde0 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62  ileio_init(p->db
1fdf0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1fe00 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e  ite3_shathree_in
1fe10 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1fe20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d  .    sqlite3_com
1fe30 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e  pletion_init(p->
1fe40 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
1fe50 71 6c 69 74 65 33 5f 64 62 64 61 74 61 5f 69 6e  qlite3_dbdata_in
1fe60 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1fe70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1fe80 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
1fe90 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
1fea0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1feb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
1fec0 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
1fed0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1fee0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1fef0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1ff00 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
1ff10 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
1ff20 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
1ff50 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
1ff60 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1ff70 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1ff80 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
1ff90 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
1ffa0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
1ffd0 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
1ffe0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1fff0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
20000 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
20010 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
20020 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20  8, p,.          
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
20050 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
20060 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20070 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
20080 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22 2c 20  l_escape_crnl", 
20090 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
200a0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
200c0 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 2c 20  hellEscapeCrnl, 
200d0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
200e0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
200f0 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
20100 5f 69 6e 74 33 32 22 2c 20 32 2c 20 53 51 4c 49  _int32", 2, SQLI
20110 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 20 20 20 20 73 68 65 6c 6c 49 6e 74          shellInt
20140 33 32 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  32, 0, 0);.#ifnd
20150 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
20160 5f 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69  _SYSTEM.    sqli
20170 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20180 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74  ion(p->db, "edit
20190 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
201a0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30    editFunc, 0, 0
201d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
201e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
201f0 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c  ->db, "edit", 2,
20200 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
20210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
20230 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65  tFunc, 0, 0);.#e
20240 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
20250 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
20260 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
20270 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
20280 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
20290 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
202a0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
202b0 4c 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70  LE zip USING zip
202c0 66 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a  file(%Q);", p->z
202d0 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
202e0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
202f0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  p->db, zSql, 0, 
20300 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
20310 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
20320 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
20330 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
20340 52 49 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65  RIALIZE.    else
20350 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
20360 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
20370 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20  _DESERIALIZE || 
20380 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
20390 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b  LL_OPEN_HEXDB ){
203a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
203b0 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d       int nData =
203c0 20 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   0;.      unsign
203d0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
203e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65        if( p->ope
203f0 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
20400 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b  N_DESERIALIZE ){
20410 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d  .        aData =
20420 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
20430 29 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62  )readFile(p->zDb
20440 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61  Filename, &nData
20450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20460 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
20470 72 65 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44  readHexDb(p, &nD
20480 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
20490 28 20 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ( aData==0 ){.  
204a0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
204b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
204c0 6f 72 20 69 6e 20 68 65 78 64 62 20 69 6e 70 75  or in hexdb inpu
204d0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  t\n");.         
204e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
204f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
20510 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c  serialize(p->db,
20520 20 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20   "main", aData, 
20530 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20  nData, nData,.  
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
20560 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c  IZE_RESIZEABLE |
20570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20580 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
20590 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f  IALIZE_FREEONCLO
205a0 53 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  SE);.      if( r
205b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
205c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
205d0 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
205e0 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72  _deserialize() r
205f0 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
20600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20610 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20   if( p->szMax>0 
20620 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20630 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
20640 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  p->db, "main", S
20650 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
20660 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61  _LIMIT, &p->szMa
20670 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
20680 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
20690 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
206a0 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
206b0 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  aes connection. 
206c0 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   Report errors..
206d0 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62  */.void close_db
206e0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
206f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20700 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69  3_close(db);.  i
20710 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
20720 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20730 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
20740 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73  _close() returns
20750 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %d: %s\n",.    
20760 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f      rc, sqlite3_
20770 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
20780 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45   .}..#if HAVE_RE
20790 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45  ADLINE || HAVE_E
207a0 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65  DITLINE./*.** Re
207b0 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f  adline completio
207c0 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73  n callbacks.*/.s
207d0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
207e0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
207f0 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20  generator(const 
20800 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20  char *text, int 
20810 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63  state){.  static
20820 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20830 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
20840 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74   *zRet;.  if( st
20850 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ate==0 ){.    ch
20860 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
20870 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20880 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
20890 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
208a0 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
208b0 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
208c0 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
208d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208e0 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
208f0 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f  completion(%Q) O
20900 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74  RDER BY 1", text
20910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
20920 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
20930 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
20940 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
20950 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
20960 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
20970 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
20980 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
20990 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70     zRet = strdup
209a0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
209b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
209c0 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
209d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
209e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
209f0 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
20a00 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  0;.    zRet = 0;
20a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
20a20 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  et;.}.static cha
20a30 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  r **readline_com
20a40 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
20a50 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69  ar *zText, int i
20a60 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
20a70 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64  {.  rl_attempted
20a80 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72  _completion_over
20a90 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
20aa0 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74  l_completion_mat
20ab0 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64  ches(zText, read
20ac0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
20ad0 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23  generator);.}..#
20ae0 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
20af0 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f  ISE./*.** Lineno
20b00 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ise completion c
20b10 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
20b20 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65  c void linenoise
20b30 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
20b40 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c  t char *zLine, l
20b50 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69  inenoiseCompleti
20b60 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20  ons *lc){.  int 
20b70 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30  nLine = strlen30
20b80 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69  (zLine);.  int i
20b90 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69  , iStart;.  sqli
20ba0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
20bb0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
20bc0 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  l;.  char zBuf[1
20bd0 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69  000];..  if( nLi
20be0 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d  ne>sizeof(zBuf)-
20bf0 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  30 ) return;.  i
20c00 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  f( zLine[0]=='.'
20c10 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23   || zLine[0]=='#
20c20 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72  ') return;.  for
20c30 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30  (i=nLine-1; i>=0
20c40 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69   && (isalnum(zLi
20c50 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b  ne[i]) || zLine[
20c60 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d  i]=='_'); i--){}
20c70 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d  .  if( i==nLine-
20c80 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53  1 ) return;.  iS
20c90 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65  tart = i+1;.  me
20ca0 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
20cb0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71  , iStart);.  zSq
20cc0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
20cd0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
20ce0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
20cf0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
20d20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51  completion(%Q,%Q
20d30 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20  ) ORDER BY 1",. 
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69          &zLine[i
20d60 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a  Start], zLine);.
20d70 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
20d80 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
20d90 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
20da0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
20db0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  ree(zSql);.  sql
20dc0 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
20dd0 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Db, "PRAGMA page
20de0 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30  _count", 0, 0, 0
20df0 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73  ); /* Load the s
20e00 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65  chema */.  while
20e10 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
20e20 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
20e30 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
20e40 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e  har *zCompletion
20e50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
20e60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
20e70 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
20e80 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69     int nCompleti
20e90 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  on = sqlite3_col
20ea0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
20eb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74   0);.    if( iSt
20ec0 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  art+nCompletion 
20ed0 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
20ee0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
20ef0 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43  (zBuf+iStart, zC
20f00 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70  ompletion, nComp
20f10 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20  letion+1);.     
20f20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d   linenoiseAddCom
20f30 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66  pletion(lc, zBuf
20f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
20f50 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20f60 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pStmt);.}.#endif
20f70 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e  ../*.** Do C-lan
20f80 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75  guage style dequ
20f90 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  oting..**.**    
20fa0 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a  \a    -> alarm.*
20fb0 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61  *    \b    -> ba
20fc0 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74  ckspace.**    \t
20fd0 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20      -> tab.**   
20fe0 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e   \n    -> newlin
20ff0 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e  e.**    \v    ->
21000 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a   vertical tab.**
21010 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72      \f    -> for
21020 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20  m feed.**    \r 
21030 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
21040 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20  eturn.**    \s  
21050 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20    -> space.**   
21060 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
21070 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20    \'    -> '.** 
21080 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b     \\    -> back
21090 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  slash.**    \NNN
210a0 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
210b0 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
210c0 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l.*/.static void
210d0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
210e0 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20  shes(char *z){. 
210f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
21100 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  r c;.  while( *z
21110 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a   && *z!='\\' ) z
21120 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
21130 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
21140 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
21150 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
21160 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
21170 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
21180 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b     if( c=='a' ){
21190 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61  .        c = '\a
211a0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
211b0 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20  f( c=='b' ){.   
211c0 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20       c = '\b';. 
211d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
211e0 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
211f0 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
21200 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
21210 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
21220 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
21230 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b  se if( c=='v' ){
21240 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76  .        c = '\v
21250 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21260 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
21270 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20       c = '\f';. 
21280 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
21290 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
212a0 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
212b0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
212c0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
212d0 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '"';.      }els
212e0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b  e if( c=='\'' ){
212f0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27  .        c = '\'
21300 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21310 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
21320 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a        c = '\\';.
21330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21340 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
21350 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
21360 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
21370 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
21380 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
21390 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
213a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
213b0 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
213c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
213d0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
213e0 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
213f0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
21400 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
21410 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
21420 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
21430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21440 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
21450 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
21460 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  j<i ) z[j] = 0;.
21470 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
21480 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
21490 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
214a0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
214b0 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
214c0 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
214d0 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
214e0 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
214f0 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
21500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
21510 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
21520 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
21530 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
21540 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
21550 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
21560 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
21570 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
21580 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
21590 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
215a0 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
215b0 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
215c0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
215d0 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
215e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
215f0 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
21600 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
21610 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
21620 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
21630 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
21640 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21650 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
21660 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
21670 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
21680 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
21690 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
216a0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
216b0 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
216c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
216d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
216e0 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
216f0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
21700 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
21710 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
21720 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
21730 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21740 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
21750 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
21760 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
21770 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
21780 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
21790 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
217a0 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
217b0 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
217c0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
217d0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
217e0 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
217f0 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
21800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21810 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
21820 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
21830 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
21840 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
21850 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
21860 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
21870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21880 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
21890 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
218a0 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
218b0 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
218c0 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
218d0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
218e0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
218f0 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
21900 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
21910 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
21920 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
21930 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
21940 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
21950 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
21960 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
21970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
21980 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
21990 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
219a0 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d  File, int bTextM
219b0 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ode){.  FILE *f;
219c0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
219d0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
219e0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
219f0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
21a00 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
21a10 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
21a20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
21a30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
21a40 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
21a50 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
21a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
21a70 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54   fopen(zFile, bT
21a80 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20  extMode ? "w" : 
21a90 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
21aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
21ab0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21ac0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
21ad0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
21ae0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
21af0 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
21b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21b10 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
21b20 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68   A routine for h
21b30 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66  andling output f
21b40 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63  rom sqlite3_trac
21b50 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
21b60 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  nt sql_trace_cal
21b70 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65  lback(.  unsigne
21b80 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20  d mType,        
21b90 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79   /* The trace ty
21ba0 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  pe */.  void *pA
21bb0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
21bc0 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74  /* The ShellStat
21bd0 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76  e pointer */.  v
21be0 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20  oid *pP,        
21bf0 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c         /* Usuall
21c00 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  y a pointer to s
21c10 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20  qlite_stmt */.  
21c20 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20  void *pX        
21c30 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c          /* Auxil
21c40 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29  iary output */.)
21c50 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
21c60 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
21c70 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  )pArg;.  sqlite3
21c80 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
21c90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
21ca0 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20  ;.  int nSql;.  
21cb0 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d  if( p->traceOut=
21cc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21cd0 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49   if( mType==SQLI
21ce0 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29  TE_TRACE_CLOSE )
21cf0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
21d00 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
21d10 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62  -- closing datab
21d20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e  ase connection\n
21d30 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
21d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70  ;.  }.  if( mTyp
21d50 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e!=SQLITE_TRACE_
21d60 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63  ROW && ((const c
21d70 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27  har*)pX)[0]=='-'
21d80 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28   ){.    zSql = (
21d90 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a  const char*)pX;.
21da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
21db0 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
21dc0 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74  mt*)pP;.    swit
21dd0 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70  ch( p->eTraceTyp
21de0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
21df0 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41  SHELL_TRACE_EXPA
21e00 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  NDED: {.        
21e10 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
21e20 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d  xpanded_sql(pStm
21e30 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
21e40 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  k;.      }.#ifde
21e50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21e60 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20  NORMALIZE.      
21e70 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  case SHELL_TRACE
21e80 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20  _NORMALIZED: {. 
21e90 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
21ea0 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64  lite3_normalized
21eb0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
21ec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21ee0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
21ef0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
21f00 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
21f10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21f30 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
21f40 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c  return 0;.  nSql
21f50 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
21f60 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c  );.  while( nSql
21f70 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d  >0 && zSql[nSql-
21f80 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d  1]==';' ){ nSql-
21f90 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d  -; }.  switch( m
21fa0 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
21fb0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f   SQLITE_TRACE_RO
21fc0 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
21fd0 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
21fe0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
21ff0 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20  tf(p->traceOut, 
22000 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c  "%.*s;\n", nSql,
22010 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72   zSql);.      br
22020 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22030 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
22040 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
22050 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22060 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c  nNanosec = *(sql
22070 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a  ite3_int64*)pX;.
22080 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
22090 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
220a0 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73  %.*s; -- %lld ns
220b0 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c  \n", nSql, zSql,
220c0 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20   nNanosec);.    
220d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
220e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
220f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
22100 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74   no-op routine t
22110 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68  hat runs with th
22120 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  e ".breakpoint" 
22130 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  doc-command.  Th
22140 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75  is is.** a usefu
22150 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20  l spot to set a 
22160 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f  debugger breakpo
22170 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
22180 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  oid test_breakpo
22190 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
221a0 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
221b0 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a  0;.  nCall++;.}.
221c0 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
221d0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
221e0 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69  CSV and other fi
221f0 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a  les for import..
22200 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
22210 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f  t ImportCtx Impo
22220 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d  rtCtx;.struct Im
22230 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73  portCtx {.  cons
22240 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
22250 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
22260 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46  nput file */.  F
22270 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
22280 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43     /* Read the C
22290 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69  SV text from thi
222a0 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  s input stream *
222b0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
222c0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d          /* Accum
222d0 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20  ulated text for 
222e0 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
222f0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
22300 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22310 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e  tes in z */.  in
22320 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
22330 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
22340 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a  ated for z[] */.
22350 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20    int nLine;    
22360 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
22370 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
22380 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b    int bNotFirst;
22390 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
223a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74   one or more byt
223b0 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20  es already read 
223c0 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20  */.  int cTerm; 
223d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
223e0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
223f0 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72  nated the most r
22400 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20  ecent field */. 
22410 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20   int cColSep;   
22420 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
22430 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
22440 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
22450 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20  y ",") */.  int 
22460 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20  cRowSep;        
22470 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72  /* The row separ
22480 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
22490 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20   (Usually "\n") 
224a0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64  */.};../* Append
224b0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
224c0 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20  o z[] */.static 
224d0 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65  void import_appe
224e0 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74  nd_char(ImportCt
224f0 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  x *p, int c){.  
22500 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
22510 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
22520 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
22530 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
22540 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
22550 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d  alloc64(p->z, p-
22560 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
22570 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c  ( p->z==0 ) shel
22580 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
22590 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d  );.  }.  p->z[p-
225a0 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  >n++] = (char)c;
225b0 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69  .}../* Read a si
225c0 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53  ngle field of CS
225d0 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69  V text.  Compati
225e0 62 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30  ble with rfc4180
225f0 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a   and extended.**
22600 20 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e   with the option
22610 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70   of having a sep
22620 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  arator other tha
22630 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b  n ","..**.**   +
22640 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
22650 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
22660 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
22670 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
22680 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
22690 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
226a0 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
226b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
226c0 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
226d0 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
226e0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
226f0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
22700 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  ","..**   +  Use
22710 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20   p->rSep as the 
22720 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
22730 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
22740 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  \n"..**   +  Kee
22750 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
22760 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  ine number in p-
22770 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
22780 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
22790 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
227a0 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
227b0 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
227c0 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
227d0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
227e0 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
227f0 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
22800 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
22810 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
22820 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  L csv_read_one_f
22830 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a  ield(ImportCtx *
22840 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  p){.  int c;.  i
22850 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f  nt cSep = p->cCo
22860 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70  lSep;.  int rSep
22870 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20   = p->cRowSep;. 
22880 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
22890 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
228a0 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
228b0 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
228c0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
228d0 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
228e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
228f0 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63  "' ){.    int pc
22900 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73  , ppc;.    int s
22910 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c  tartLine = p->nL
22920 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75  ine;.    int cQu
22930 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20  ote = c;.    pc 
22940 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77  = ppc = 0;.    w
22950 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
22960 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
22970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
22980 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b  rSep ) p->nLine+
22990 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
229a0 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
229b0 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
229c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63   ){.          pc
229d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
229e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
229f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22a00 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26    if( (c==cSep &
22a10 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
22a20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70       || (c==rSep
22a30 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
22a40 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
22a50 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26  ep && pc=='\r' &
22a60 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  & ppc==cQuote). 
22a70 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46        || (c==EOF
22a80 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
22a90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22aa0 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68   do{ p->n--; }wh
22ab0 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21  ile( p->z[p->n]!
22ac0 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20  =cQuote );.     
22ad0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
22ae0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22b00 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20  ( pc==cQuote && 
22b10 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  c!='\r' ){.     
22b20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
22b30 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
22b40 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72  nescaped %c char
22b50 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20  acter\n",.      
22b60 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
22b70 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51  le, p->nLine, cQ
22b80 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uote);.      }. 
22b90 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20       if( c==EOF 
22ba0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
22bb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
22bc0 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61  %s:%d: untermina
22bd0 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69  ted %c-quoted fi
22be0 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eld\n",.        
22bf0 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65          p->zFile
22c00 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75  , startLine, cQu
22c10 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ote);.        p-
22c20 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
22c30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22c40 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f   }.      import_
22c50 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
22c60 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70  );.      ppc = p
22c70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b  c;.      pc = c;
22c80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22c90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
22ca0 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
22cb0 64 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61  d being parsed a
22cc0 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74  nd it begins wit
22cd0 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46  h the.    ** UTF
22ce0 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42  -8 BOM  (0xEF BB
22cf0 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74   BF) then skip t
22d00 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66  he BOM */.    if
22d10 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66  ( (c&0xff)==0xef
22d20 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74   && p->bNotFirst
22d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  ==0 ){.      imp
22d40 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
22d50 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
22d60 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
22d70 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
22d80 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20  )==0xbb ){.     
22d90 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
22da0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
22db0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
22dc0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  ->in);.        i
22dd0 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
22de0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
22df0 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
22e00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20  .          p->n 
22e10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
22e20 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f  eturn csv_read_o
22e30 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20  ne_field(p);.   
22e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22e50 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
22e60 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
22e70 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
22e80 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
22e90 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
22ea0 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
22eb0 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  p->in);.    }.  
22ec0 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b    if( c==rSep ){
22ed0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
22ee0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
22ef0 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
22f00 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
22f10 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
22f20 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a  >cTerm = c;.  }.
22f30 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
22f40 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  z[p->n] = 0;.  p
22f50 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
22f60 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
22f70 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
22f80 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43  gle field of ASC
22f90 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78  II delimited tex
22fa0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  t..**.**   +  In
22fb0 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
22fc0 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
22fd0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
22fe0 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
22ff0 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
23000 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
23010 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
23020 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
23030 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
23040 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
23050 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
23060 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31   default is "\x1
23070 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  F"..**   +  Use 
23080 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
23090 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
230a0 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
230b0 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65  x1E"..**   +  Ke
230c0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
230d0 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  row number in p-
230e0 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
230f0 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
23100 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
23110 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
23120 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
23130 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
23140 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
23150 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
23160 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
23170 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
23180 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
23190 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65  L ascii_read_one
231a0 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
231b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
231c0 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
231d0 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
231e0 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
231f0 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
23200 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
23210 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
23220 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
23230 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
23240 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
23250 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
23260 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
23270 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b  ep && c!=rSep ){
23280 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65  .    import_appe
23290 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
232a0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
232b0 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  in);.  }.  if( c
232c0 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d  ==rSep ){.    p-
232d0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20  >nLine++;.  }.  
232e0 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
232f0 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
23300 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
23310 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
23320 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
23330 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
23340 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
23350 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
23360 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
23370 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
23380 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
23390 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
233a0 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
233b0 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
233c0 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
233d0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
233e0 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68  oCloneData(.  Sh
233f0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
23400 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
23410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
23420 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ble.){.  sqlite3
23430 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
23440 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
23450 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  t *pInsert = 0;.
23460 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
23470 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73   0;.  char *zIns
23480 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ert = 0;.  int r
23490 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  c;.  int i, j, n
234a0 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d  ;.  int nTable =
234b0 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65   strlen30(zTable
234c0 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a  );.  int k = 0;.
234d0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
234e0 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52   const int spinR
234f0 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20  ate = 10000;..  
23500 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
23510 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
23520 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c   * FROM \"%w\"",
23530 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d   zTable);.  rc =
23540 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23550 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
23560 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
23570 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
23580 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23590 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
235a0 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
235b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
235c0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
235d0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
235e0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
235f0 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
23600 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
23610 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
23620 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  r;.  }.  n = sql
23630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
23640 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e  t(pQuery);.  zIn
23650 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  sert = sqlite3_m
23660 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54  alloc64(200 + nT
23670 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69  able + n*3);.  i
23680 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20  f( zInsert==0 ) 
23690 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
236a0 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ory();.  sqlite3
236b0 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54  _snprintf(200+nT
236c0 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20  able,zInsert,.  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
236f0 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56  RE INTO \"%s\" V
23700 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
23710 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33  );.  i = strlen3
23720 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f  0(zInsert);.  fo
23730 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=1; j<n; j++)
23740 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e  {.    memcpy(zIn
23750 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29  sert+i, ",?", 2)
23760 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20  ;.    i += 2;.  
23770 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65  }.  memcpy(zInse
23780 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a  rt+i, ");", 3);.
23790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
237a0 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c  repare_v2(newDb,
237b0 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70   zInsert, -1, &p
237c0 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66  Insert, 0);.  if
237d0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
237e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
237f0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
23800 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
23810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
23820 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
23830 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
23840 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
23850 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
23860 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
23870 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
23880 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
23890 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
238a0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
238b0 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
238c0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
238d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
238e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
238f0 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
23900 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
23910 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
23920 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
23930 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
23940 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
23950 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
23960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23970 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23980 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
23990 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
239a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
239b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
239c0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
239d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
239e0 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
239f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23a00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
23a10 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
23a20 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
23a30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23a40 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
23a50 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
23a60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
23a70 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
23a80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23aa0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
23ab0 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
23ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
23ad0 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
23ae0 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
23b10 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
23b20 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
23b50 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
23b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23b70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
23b80 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
23b90 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
23ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23bb0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
23bc0 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
23bd0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
23be0 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
23c20 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
23c30 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
23c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23c80 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
23c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ca0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
23cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23cc0 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
23cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23ce0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
23cf0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
23d00 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
23d10 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
23d20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
23d30 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20  rror %d: %s\n", 
23d40 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
23d50 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
23d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d80 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
23d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23da0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e  qlite3_reset(pIn
23db0 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74  sert);.      cnt
23dc0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  ++;.      if( (c
23dd0 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20  nt%spinRate)==0 
23de0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
23df0 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c  f("%c\b", "|/-\\
23e00 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29  "[(cnt/spinRate)
23e10 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66  %4]);.        ff
23e20 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
23e30 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45      }.    } /* E
23e40 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20  nd while */.    
23e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
23e60 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ONE ) break;.   
23e70 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
23e80 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  e(pQuery);.    s
23e90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
23ea0 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20  ry);.    zQuery 
23eb0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23ec0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
23ed0 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59   \"%w\" ORDER BY
23ee0 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20   rowid DESC;",. 
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
23f10 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
23f20 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23f30 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
23f40 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
23f50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23f60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23f70 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
23f80 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c  g: cannot step \
23f90 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22  "%s\" backwards"
23fa0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , zTable);.     
23fb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23fc0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30  } /* End for(k=0
23fd0 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74  ...) */..end_dat
23fe0 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
23ff0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
24000 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  y);.  sqlite3_fi
24010 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
24020 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24030 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  zQuery);.  sqlit
24040 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29  e3_free(zInsert)
24050 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
24060 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20  to transfer all 
24070 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65  rows of the sche
24080 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57  ma that match zW
24090 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61  here.  For.** ea
240a0 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78  ch row, invoke x
240b0 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65  ForEach() on the
240c0 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20   object defined 
240d0 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  by that row..** 
240e0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
240f0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
24100 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20   moving forward 
24110 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73  through the.** s
24120 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
24130 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f  le, try again mo
24140 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a  ving backwards..
24150 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
24160 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
24170 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
24180 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
24190 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
241a0 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64   *zWhere,.  void
241b0 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65   (*xForEach)(She
241c0 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33  llState*,sqlite3
241d0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
241e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
241f0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
24200 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
24210 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
24220 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
24230 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
24240 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
24250 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
24260 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a  ErrMsg = 0;..  z
24270 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
24280 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
24290 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  name, sql FROM s
242a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242c0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
242d0 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20   %s", zWhere);. 
242e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
242f0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
24300 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
24310 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
24320 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
24330 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
24340 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
24350 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24370 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
24380 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
24390 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
243a0 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
243b0 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
243c0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  ;.    goto end_s
243d0 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  chema_xfer;.  }.
243e0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
243f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
24400 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
24410 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
24420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24430 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
24440 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
24450 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
24460 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70  Query, 1);.    p
24470 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
24480 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
24490 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  tdout);.    sqli
244a0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
244b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
244c0 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
244d0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
244e0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
244f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24500 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
24510 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
24520 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
24530 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
24540 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
24550 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
24560 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
24570 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
24580 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
24590 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
245a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
245b0 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
245c0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
245d0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
245e0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
245f0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
24600 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
24610 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
24620 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
24630 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
24640 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
24650 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
24680 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
24690 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
246a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
246b0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
246c0 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
246d0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
246e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
246f0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24700 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
24710 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
24740 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
24750 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
24760 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
24790 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
247a0 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  _xfer;.    }.   
247b0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
247c0 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
247d0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
247e0 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
247f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24800 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
24810 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
24820 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24830 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
24840 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
24850 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
24860 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
24870 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
24880 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
24890 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  ar*)zSql, 0, 0, 
248a0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
248b0 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
248c0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
248d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
248e0 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
248f0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
24900 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Sql);.        sq
24910 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
24920 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  sg);.        zEr
24930 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
24940 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72  }.      if( xFor
24950 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Each ){.        
24960 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
24970 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
24980 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24990 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f        printf("do
249a0 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ne\n");.    }.  
249b0 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  }.end_schema_xfe
249c0 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
249d0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
249e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
249f0 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  uery);.}../*.** 
24a00 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
24a10 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  ase file named "
24a20 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f  zNewDb".  Try to
24a30 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   recover as much
24a40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
24a50 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20  as possible out 
24a60 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
24a70 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68  base (which migh
24a80 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e  t be corrupt) an
24a90 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e  d write it.** in
24aa0 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74  to zNewDb..*/.st
24ab0 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
24ac0 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lone(ShellState 
24ad0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
24ae0 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72  zNewDb){.  int r
24af0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  c;.  sqlite3 *ne
24b00 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  wDb = 0;.  if( a
24b10 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d  ccess(zNewDb,0)=
24b20 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
24b30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
24b40 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ile \"%s\" alrea
24b50 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a  dy exists.\n", z
24b60 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75  NewDb);.    retu
24b70 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
24b80 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77  qlite3_open(zNew
24b90 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69  Db, &newDb);.  i
24ba0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
24bb0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24bc0 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
24bd0 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
24be0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
24bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
24c00 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
24c10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
24c20 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
24c30 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
24c40 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
24c50 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
24c60 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
24c70 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
24c80 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
24c90 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
24ca0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
24cb0 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
24cc0 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
24cd0 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
24ce0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
24cf0 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
24d00 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
24d10 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
24d20 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
24d30 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
24d40 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
24d50 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
24d60 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
24d70 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44  .  close_db(newD
24d80 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
24d90 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
24da0 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
24db0 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ut..**.** If the
24dc0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c   p->doXdgOpen fl
24dd0 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
24de0 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74  means the output
24df0 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65   was being.** re
24e00 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65  directed to a te
24e10 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
24e20 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69  ed by p->zTempFi
24e30 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
24e40 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61  e,.** launch sta
24e50 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e  rt/open/xdg-open
24e60 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
24e70 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
24e80 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72  ic void output_r
24e90 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
24ea0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75  *p){.  if( p->ou
24eb0 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  tfile[0]=='|' ){
24ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24ed0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70  OMIT_POPEN.    p
24ee0 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
24ef0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
24f00 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
24f10 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69  lose(p->out);.#i
24f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
24f30 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69  AVE_SYSTEM.    i
24f40 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
24f50 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
24f60 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64  har *zXdgOpenCmd
24f70 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   =.#if defined(_
24f80 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74  WIN32).      "st
24f90 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69  art";.#elif defi
24fa0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
24fb0 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c       "open";.#el
24fc0 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70  se.      "xdg-op
24fd0 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  en";.#endif.    
24fe0 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
24ff0 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
25000 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25  e3_mprintf("%s %
25010 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c  s", zXdgOpenCmd,
25020 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a   p->zTempFile);.
25030 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d        if( system
25040 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20  (zCmd) ){.      
25050 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25060 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b  derr, "Failed: [
25070 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  %s]\n", zCmd);. 
25080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
25090 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
250a0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
250b0 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70  ePop(p);.      p
250c0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b  ->doXdgOpen = 0;
250d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
250e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
250f0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20  _NOHAVE_SYSTEM) 
25100 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  */.  }.  p->outf
25110 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
25120 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
25130 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
25140 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
25150 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
25160 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
25170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
25180 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
25190 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
251a0 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
251b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
251c0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
251d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
251e0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
251f0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
25200 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
25210 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
25220 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
25230 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
25240 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
25250 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
25260 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
25270 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
25280 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
25290 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
252a0 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
252b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
252c0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
252d0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
252e0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
252f0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
25300 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
25310 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
25320 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
25330 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
25340 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
25350 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
25360 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
25370 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
25380 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
25390 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
253a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
253b0 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
253c0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
253d0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
253e0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
253f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25400 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
25410 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
25420 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
25430 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
25440 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
25450 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
25460 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
25470 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
25480 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
25490 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
254a0 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
254b0 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
254c0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
254d0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
254e0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
254f0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
25500 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
25510 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
25520 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
25530 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
25540 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
25550 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
25560 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
25570 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
25580 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
25590 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
255a0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
255b0 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
255c0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
255d0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
255e0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
255f0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
25600 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
25610 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
25620 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
25630 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
25640 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
25650 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
25660 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
25670 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
25680 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
25690 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
256a0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
256b0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
256c0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
256d0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
256e0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
256f0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
25700 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
25710 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
25720 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
25730 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
25740 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
25750 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
25760 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
25770 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
25780 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
25790 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
257a0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
257b0 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
257c0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
257d0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
257e0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
257f0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
25800 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
25810 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
25820 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
25830 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
25840 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75    int i, rc;.  u
25850 6e 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72  nsigned iDataVer
25860 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  sion;.  char *zS
25870 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
25880 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
25890 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
258a0 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
258b0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
258c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
258d0 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
258e0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
258f0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
25900 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  urn 1;.  rc = sq
25910 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
25920 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
25930 20 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74       "SELECT dat
25940 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
25950 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70  page(?1) WHERE p
25960 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  gno=1",.        
25970 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
25980 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
25990 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
259a0 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
259b0 75 73 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50  used("ENABLE_DBP
259c0 41 47 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20  AGE_VTAB") ){.  
259d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
259e0 73 74 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e  stderr, "the \".
259f0 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64  dbinfo\" command
25a00 20 72 65 71 75 69 72 65 73 20 74 68 65 20 22 0a   requires the ".
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c            "-DSQL
25a30 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
25a40 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74  E_VTAB compile-t
25a50 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b  ime options\n");
25a60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25a70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25a80 64 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73  derr, "error: %s
25a90 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
25aa0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
25ab0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
25ac0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
25ad0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25ae0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
25af0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
25b00 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
25b10 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
25b20 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
25b30 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
25b40 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
25b50 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
25b60 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
25b70 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
25b80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
25b90 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
25ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
25bb0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
25bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
25bd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
25be0 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
25bf0 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
25c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25c10 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
25c20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25c30 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
25c40 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
25c50 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
25c60 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
25c70 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
25c80 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
25c90 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
25ca0 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
25cb0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
25cc0 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
25cd0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
25ce0 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
25cf0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
25d00 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
25d10 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
25d20 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
25d30 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
25d40 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
25d50 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
25d60 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
25d70 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
25d80 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
25d90 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
25da0 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
25db0 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
25dc0 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
25dd0 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
25de0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
25df0 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
25e00 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
25e10 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
25e20 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
25e30 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
25e40 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
25e50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
25e60 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
25e70 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
25e80 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
25e90 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
25ea0 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
25eb0 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
25ec0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
25ed0 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
25ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
25ef0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
25f00 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
25f10 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
25f20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
25f30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
25f40 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
25f50 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
25f60 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
25f70 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
25f80 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
25f90 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
25fa0 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
25fb0 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
25fc0 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
25fd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25fe0 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
25ff0 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
26000 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
26010 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
26020 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
26030 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
26040 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
26050 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
26060 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
26070 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
26080 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
26090 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
260a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
260b0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
260c0 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
260d0 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
260e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
260f0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73  zSchemaTab);.  s
26100 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
26110 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  rol(p->db, zDb, 
26120 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
26130 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74  A_VERSION, &iDat
26140 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66  aVersion);.  utf
26150 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26160 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22   "%-20s %u\n", "
26170 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69  data version", i
26180 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
26190 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
261a0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
261b0 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
261c0 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
261d0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
261e0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
261f0 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
26200 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
26210 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
26220 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
26230 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
26240 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26250 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
26260 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
26270 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
26280 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
26290 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
262a0 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
262b0 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
262c0 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
262d0 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
262e0 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
262f0 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
26300 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
26310 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
26320 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
26330 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
26340 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
26350 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
26360 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
26370 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
26380 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
26390 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
263a0 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
263b0 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
263c0 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
263e0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
263f0 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
26400 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
26410 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
26420 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
26430 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
26440 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
26450 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
26460 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
26470 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
26480 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
26490 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
264a0 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
264b0 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
264c0 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
264d0 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
264e0 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
26500 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
26510 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
26520 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
26530 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
26540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
26550 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
26560 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
26570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
26580 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
26590 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
265a0 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
265b0 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
265c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
265d0 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
265e0 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
265f0 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
26600 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
26610 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
26620 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
26630 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
26640 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
26650 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
26660 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
26670 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
26680 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
26690 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
266a0 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
266b0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
266c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
266d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
266e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
266f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
26700 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
26710 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
26720 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
26730 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
26740 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
26750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
26760 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
26770 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
26780 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
26790 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
267a0 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
267b0 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
267c0 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
267d0 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
267e0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
267f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
26800 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
26810 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
26820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
26830 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
26840 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
26850 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
26860 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
26870 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26880 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
26890 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
268a0 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
268b0 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
268c0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
268d0 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
268e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
268f0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
26900 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
26910 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
26920 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
26930 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
26940 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
26950 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
26960 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
26970 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
26980 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
26990 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
269a0 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
269b0 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
269c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
269d0 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
269e0 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
269f0 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
26a00 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
26a10 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
26a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26a30 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
26a40 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
26a50 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
26a60 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
26a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26a80 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
26a90 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
26aa0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
26ab0 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
26ac0 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
26ad0 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
26ae0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
26af0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
26b00 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
26b10 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
26b20 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
26b30 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
26b40 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
26b50 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
26b60 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
26b70 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
26b80 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
26b90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
26ba0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
26bb0 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
26bc0 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
26bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
26be0 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
26bf0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
26c00 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
26c10 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
26c20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
26c30 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
26c40 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
26c50 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
26c60 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
26c70 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
26c80 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
26c90 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
26ca0 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
26cb0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
26cc0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
26cd0 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
26ce0 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
26cf0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
26d00 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
26d10 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
26d20 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
26d30 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
26d40 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
26d50 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
26d60 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
26d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
26d80 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
26d90 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
26da0 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
26db0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
26dc0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
26dd0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
26de0 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
26df0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
26e00 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
26e10 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
26e20 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
26e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
26e40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
26e50 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66  mporary file (if
26e60 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61   there is one) a
26e70 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d  nd free the.** m
26e80 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f  emory used to ho
26e90 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
26ea0 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f  he temp file..*/
26eb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
26ec0 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  arTempFile(Shell
26ed0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
26ee0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
26ef0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
26f00 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20   p->doXdgOpen ) 
26f10 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68  return;.  if( sh
26f20 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d  ellDeleteFile(p-
26f30 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65  >zTempFile) ) re
26f40 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
26f50 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
26f60 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
26f70 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  le = 0;.}../*.**
26f80 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65   Create a new te
26f90 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74  mp file name wit
26fa0 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
26fb0 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ix..*/.static vo
26fc0 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53  id newTempFile(S
26fd0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
26fe0 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
26ff0 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  x){.  clearTempF
27000 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ile(p);.  sqlite
27010 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
27020 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
27030 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  File = 0;.  if( 
27040 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
27050 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27060 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49  l(p->db, 0, SQLI
27070 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
27080 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70  ENAME, &p->zTemp
27090 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
270a0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
270b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
270c0 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71  uint64 r;.    sq
270d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
270e0 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
270f0 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
27100 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
27110 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73  ntf("temp%llx.%s
27120 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a  ", r, zSuffix);.
27130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
27140 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
27150 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
27160 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  %s", p->zTempFil
27170 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  e, zSuffix);.  }
27180 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
27190 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ile==0 ){.    ra
271a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
271b0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
271c0 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
271d0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
271e0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
271f0 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
27200 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
27210 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
27220 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
27230 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
27240 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
27250 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
27260 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
27270 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
27280 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
27290 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
272a0 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
272b0 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
272c0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
272d0 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
272e0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
272f0 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
27300 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
27310 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
27320 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
27330 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
27340 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
27350 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
27360 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
27370 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
27380 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
27390 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
273a0 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
273b0 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
273c0 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
273d0 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
273e0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
273f0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
27400 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
27410 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
27420 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
27430 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
27440 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
27450 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
27460 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
27470 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
27480 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
27490 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
274a0 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
274b0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
274c0 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
274d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
274e0 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
274f0 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
27500 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
27510 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
27520 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
27530 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
27540 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
27550 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
27560 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
27570 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
27580 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
27590 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
275a0 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
275b0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
275c0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
275d0 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
275e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
275f0 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
27600 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
27610 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
27620 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
27630 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
27640 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
27650 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
27660 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
27670 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
27680 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
27690 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
276a0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
276b0 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
276c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
276d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
276e0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
276f0 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
27700 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
27710 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
27720 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
27730 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27740 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
27750 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
27760 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
27770 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
27780 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
27790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
277a0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
277b0 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
277c0 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
277d0 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
277e0 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
277f0 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
27800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27810 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27820 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
27830 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
27840 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
27850 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
27860 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
27870 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
27880 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27890 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
278a0 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
278b0 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
278c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
278d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
278e0 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
278f0 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
27900 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
27910 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
27920 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
27930 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
27940 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
27950 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
27960 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
27970 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
27980 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
27990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
279a0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
279b0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
279c0 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
279d0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
279e0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
279f0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
27a20 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
27a30 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
27a40 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27a70 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
27a80 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
27a90 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
27aa0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
27ab0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
27ac0 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
27ad0 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
27ae0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
27af0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
27b00 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
27b10 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
27b20 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
27b30 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
27b40 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
27b50 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
27b60 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
27b70 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
27b80 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
27b90 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
27ba0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
27bd0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
27be0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
27bf0 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
27c00 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
27c10 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
27c20 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
27c30 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27c60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
27c70 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
27c80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
27c90 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
27ca0 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
27cb0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
27cc0 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
27cd0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
27ce0 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
27cf0 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
27d00 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
27d10 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
27d20 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
27d30 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
27d40 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
27d50 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
27d60 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
27d70 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
27d80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
27d90 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
27da0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
27db0 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
27dc0 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
27dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
27de0 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
27df0 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
27e00 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
27e10 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
27e20 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
27e30 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
27e40 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
27e50 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
27e60 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
27e70 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
27e80 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
27e90 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
27ea0 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
27eb0 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
27ec0 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
27ed0 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
27ee0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
27ef0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
27f00 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
27f10 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
27f20 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
27f30 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
27f40 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
27f50 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
27f60 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
27f70 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
27f80 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
27f90 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
27fa0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
27fb0 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
27fc0 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
27fd0 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
27fe0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
27ff0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
28000 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
28010 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
28020 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
28030 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
28040 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
28050 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
28060 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
28070 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
28080 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
28090 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
280a0 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
280b0 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
280c0 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
280d0 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
280e0 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
280f0 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
28100 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
28110 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
28120 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
28130 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
28140 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
28150 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
28160 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
28170 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
28180 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
28190 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
281a0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
281b0 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
281c0 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
281d0 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
281e0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
281f0 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
28200 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
28210 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
28220 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
28230 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
28240 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
28250 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
28260 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
28270 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
28280 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
28290 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
282a0 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
282b0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
282c0 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
282d0 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
282e0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
282f0 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
28300 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
28310 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
28320 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
28330 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
28340 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
28350 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
28360 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
28370 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
28380 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
28390 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
283a0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
283b0 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
283c0 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
283d0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
283e0 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
283f0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
28400 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
28410 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
28420 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
28430 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
28440 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
28450 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
28460 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
28470 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
28480 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
28490 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
284a0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
284b0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
284c0 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
284d0 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
284e0 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
284f0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28500 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
28510 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
28520 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
28530 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
28540 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
28550 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
28560 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
28570 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
28580 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
28590 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
285a0 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
285b0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
285c0 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
285d0 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
285e0 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
285f0 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
28600 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
28610 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
28620 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
28630 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
28640 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
28650 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
28660 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
28670 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
28680 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
28690 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
286a0 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
286b0 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
286c0 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
286d0 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
286e0 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
286f0 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
28700 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
28710 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
28720 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
28730 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
28740 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
28750 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
28760 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
28770 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  0(azArg[i]);.   
28780 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
28790 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
287a0 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
287b0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
287c0 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
287d0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
287e0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
287f0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
28800 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
28810 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
28820 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
28830 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
28840 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
28850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
28860 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28870 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
28880 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
28890 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
288a0 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
288b0 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
288c0 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
288d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
288e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
288f0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
28900 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
28910 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
28920 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
28930 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
28940 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
28950 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
28960 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
28970 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
28980 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
28990 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
289a0 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
289b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
289c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
289d0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
289e0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
289f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
28a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
28a10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
28a20 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
28a30 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
28a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28a50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
28a60 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
28a70 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
28a80 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
28a90 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
28aa0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
28ab0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
28ac0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
28ad0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
28ae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
28af0 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
28b00 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
28b10 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
28b20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
28b30 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
28b40 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
28b50 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
28b60 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
28b70 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
28b80 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
28b90 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28ba0 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
28bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
28bc0 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
28bd0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
28be0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
28bf0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28c00 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
28c10 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
28c20 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
28c30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
28c40 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
28c50 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
28c60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
28c70 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
28c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
28c90 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
28ca0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
28cb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
28cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28cd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
28ce0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
28cf0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
28d00 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
28d10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
28d20 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
28d30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28d40 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
28d50 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
28d60 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
28d70 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
28d80 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
28d90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
28da0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
28db0 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
28dc0 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
28dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
28de0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28df0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
28e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28e10 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
28e20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
28e30 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
28e40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
28e50 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
28e60 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
28e70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
28e80 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
28e90 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
28ea0 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
28eb0 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
28ec0 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
28ed0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
28ee0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
28ef0 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
28f00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
28f10 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
28f20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
28f30 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
28f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28f50 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
28f60 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
28f70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
28f80 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
28f90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28fa0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
28fb0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
28fc0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
28fd0 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
28fe0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
28ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
29000 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
29010 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
29020 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
29030 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
29040 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
29050 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
29070 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
29080 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
29090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
290a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
290b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
290c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
290d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
290e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
290f0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
29100 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
29110 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
29120 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
29130 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
29140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29150 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
29160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
29170 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
29180 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29190 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
291a0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
291b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
291c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
291d0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
291e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
291f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
29210 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
29220 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
29230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29240 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
29250 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
29260 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
29270 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
29280 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
29290 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
292c0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
292d0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
292e0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29310 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
29320 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
29330 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
29340 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 ? strlen30(azA
29350 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69  rg[1]) : 0);.  i
29360 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65  f( n<1 || sqlite
29370 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67  3_strnicmp(azArg
29380 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78  [1], "fkey-index
29390 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75  es", n) ) goto u
293a0 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c  sage;.  return l
293b0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70  intFkeyIndexes(p
293c0 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41  State, azArg, nA
293d0 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20  rg);.. usage:.  
293e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
293f0 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62  r, "Usage %s sub
29400 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68  -command ?switch
29410 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67  es...?\n", azArg
29420 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  [0]);.  raw_prin
29430 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72  tf(stderr, "Wher
29440 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61  e sub-commands a
29450 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70  re:\n");.  raw_p
29460 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
29470 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c     fkey-indexes\
29480 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
29490 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  LITE_ERROR;.}..#
294a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
294b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
294c0 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
294d0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
294e0 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  B)./************
294f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29530 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61  *****.** The ".a
29540 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
29550 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
29560 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
29570 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
29580 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
29590 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
295a0 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74   *zSql, .  sqlit
295b0 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
295c0 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
295d0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
295e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
295f0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
29600 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
29610 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
29620 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
29630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29640 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29650 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72  stderr, "sql err
29660 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20  or: %s (%d)\n", 
29670 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29680 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73  e3_errmsg(db), s
29690 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
296a0 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  b).      );.    
296b0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
296c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
296d0 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61   void shellPrepa
296e0 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69  rePrintf(.  sqli
296f0 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
29700 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
29710 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
29720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
29730 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mt, .  ....){.  
29740 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
29750 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
29760 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73  OK ){.    va_lis
29770 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  t ap;.    char *
29780 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  z;.    va_start(
29790 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
297a0 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
297b0 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
297c0 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
297d0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
297e0 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
297f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
29800 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c  lse{.      shell
29810 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c  Prepare(db, pRc,
29820 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20   z, ppStmt);.   
29830 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29840 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  z);.    }.  }.}.
29850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
29860 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e  llFinalize(.  in
29870 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
29880 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
29890 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  {.  if( pStmt ){
298a0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
298b0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
298c0 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
298d0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
298e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
298f0 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d  );.    if( *pRc=
29900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29930 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29940 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
29950 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
29960 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
29970 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d    }.      *pRc =
29980 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
29990 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
299a0 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20  ellReset(.  int 
299b0 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
299c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
299d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
299e0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
299f0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
29a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
29a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29a20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29a30 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
29a40 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
29a50 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29a60 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
29a70 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
29a80 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
29a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
29aa0 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a   = rc;.  }.}./*.
29ab0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70  ** Structure rep
29ac0 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67  resenting a sing
29ad0 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  le ".ar" command
29ae0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
29af0 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72  uct ArCommand Ar
29b00 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20  Command;.struct 
29b10 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38  ArCommand {.  u8
29b20 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20   eCmd;          
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b40 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c   An AR_CMD_* val
29b50 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62  ue */.  u8 bVerb
29b60 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ose;            
29b70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29b80 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a  if --verbose */.
29b90 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20    u8 bZip;      
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
29bc0 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a 49   archive is a ZI
29bd0 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75  P */.  u8 bDryRu
29be0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
29bf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29c00 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20  f --dry-run */. 
29c10 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20   u8 bAppend;    
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70   /* True if --ap
29c40 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f  pend */.  u8 fro
29c50 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20  mCmdLine;       
29c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
29c70 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64   from -A instead
29c80 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a   of .archive */.
29c90 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
29cc0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
29cd0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63   */.  char *zSrc
29ce0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
29cf0 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22        /* "sqlar"
29d00 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65  , "zipfile($file
29d10 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20  )" or "zip" */. 
29d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
29d30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
29d40 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d   /* --file argum
29d50 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
29d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29d70 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ir;             
29d80 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79    /* --directory
29d90 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
29da0 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  LL */.  char **a
29db0 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  zArg;           
29dc0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
29dd0 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75   of command argu
29de0 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c  ments */.  Shell
29df0 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20  State *p;       
29e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
29e10 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  ell state */.  s
29e20 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e40 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
29e50 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69 76  ining the archiv
29e60 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  e */.};../*.** P
29e70 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73  rint a usage mes
29e80 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
29e90 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
29ea0 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  rr and return SQ
29eb0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73  LITE_ERROR..*/.s
29ec0 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67  tatic int arUsag
29ed0 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68  e(FILE *f){.  sh
29ee0 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76  owHelp(f,"archiv
29ef0 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e");.  return SQ
29f00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
29f10 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
29f20 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
29f30 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
29f40 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
29f50 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
29f60 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
29f70 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28   int arErrorMsg(
29f80 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
29f90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
29fa0 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
29fb0 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
29fc0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
29fd0 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  zFmt);.  z = sql
29fe0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
29ff0 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mt, ap);.  va_en
2a000 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72  d(ap);.  utf8_pr
2a010 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2a020 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ror: %s\n", z);.
2a030 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43    if( pAr->fromC
2a040 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74  mdLine ){.    ut
2a050 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a060 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f  , "Use \"-A\" fo
2a070 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b  r more help\n");
2a080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
2a090 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a0a0 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76  , "Use \".archiv
2a0b0 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d  e --help\" for m
2a0c0 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20  ore help\n");.  
2a0d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2a0e0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (z);.  return SQ
2a0f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
2a100 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  *.** Values for 
2a110 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a  ArCommand.eCmd..
2a120 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d  */.#define AR_CM
2a130 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31  D_CREATE       1
2a140 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
2a150 55 50 44 41 54 45 20 20 20 20 20 20 20 32 0a 23  UPDATE       2.#
2a160 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e  define AR_CMD_IN
2a170 53 45 52 54 20 20 20 20 20 20 20 33 0a 23 64 65  SERT       3.#de
2a180 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  fine AR_CMD_EXTR
2a190 41 43 54 20 20 20 20 20 20 34 0a 23 64 65 66 69  ACT      4.#defi
2a1a0 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20  ne AR_CMD_LIST  
2a1b0 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65         5.#define
2a1c0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20   AR_CMD_HELP    
2a1d0 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74       6../*.** Ot
2a1e0 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64  her (non-command
2a1f0 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23  ) switches..*/.#
2a200 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
2a210 5f 56 45 52 42 4f 53 45 20 20 20 20 20 37 0a 23  _VERBOSE     7.#
2a220 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
2a230 5f 46 49 4c 45 20 20 20 20 20 20 20 20 38 0a 23  _FILE        8.#
2a240 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
2a250 5f 44 49 52 45 43 54 4f 52 59 20 20 20 39 0a 23  _DIRECTORY   9.#
2a260 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
2a270 5f 41 50 50 45 4e 44 20 20 20 20 20 31 30 0a 23  _APPEND     10.#
2a280 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
2a290 5f 44 52 59 52 55 4e 20 20 20 20 20 31 31 0a 0a  _DRYRUN     11..
2a2a0 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f  static int arPro
2a2b0 63 65 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d  cessSwitch(ArCom
2a2c0 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65  mand *pAr, int e
2a2d0 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68  Switch, const ch
2a2e0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69  ar *zArg){.  swi
2a2f0 74 63 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a  tch( eSwitch ){.
2a300 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2a310 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65  CREATE:.    case
2a320 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a   AR_CMD_EXTRACT:
2a330 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
2a340 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20  _LIST:.    case 
2a350 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20  AR_CMD_UPDATE:. 
2a360 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49     case AR_CMD_I
2a370 4e 53 45 52 54 3a 0a 20 20 20 20 63 61 73 65 20  NSERT:.    case 
2a380 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20  AR_CMD_HELP:.   
2a390 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64     if( pAr->eCmd
2a3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a3b0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2a3c0 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  r, "multiple com
2a3d0 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a  mand options");.
2a3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
2a3f0 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63  r->eCmd = eSwitc
2a400 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  h;.      break;.
2a410 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
2a420 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20  TCH_DRYRUN:.    
2a430 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d    pAr->bDryRun =
2a440 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2a450 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
2a460 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20  TCH_VERBOSE:.   
2a470 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
2a480 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
2a490 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
2a4a0 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20  WITCH_APPEND:.  
2a4b0 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64      pAr->bAppend
2a4c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
2a4d0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d  all thru into --
2a4e0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  file */.    case
2a4f0 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a   AR_SWITCH_FILE:
2a500 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c  .      pAr->zFil
2a510 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
2a520 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2a530 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
2a540 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ORY:.      pAr->
2a550 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  zDir = zArg;.   
2a560 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
2a570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a580 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  K;.}../*.** Pars
2a590 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
2a5a0 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20  ne for an ".ar" 
2a5b0 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73  command. The res
2a5c0 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
2a5d0 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75   into.** structu
2a5e0 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54  re (*pAr). SQLIT
2a5f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2a600 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
2a610 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a  line is parsed.*
2a620 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2a630 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
2a640 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
2a650 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20  itten to stderr 
2a660 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  and .** SQLITE_E
2a670 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a  RROR returned..*
2a680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  /.static int arP
2a690 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63  arseCommand(.  c
2a6a0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a6c0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2a6d0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
2a6e0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
2a6f0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2a720 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
2a730 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  */.  ArCommand *
2a740 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20  pAr             
2a750 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
2a760 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
2a770 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  ){.  struct ArSw
2a780 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74  itch {.    const
2a790 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20   char *zLong;.  
2a7a0 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20    char cShort;. 
2a7b0 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20     u8 eSwitch;. 
2a7c0 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20     u8 bArg;.  } 
2a7d0 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20  aSwitch[] = {.  
2a7e0 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20    { "create",   
2a7f0 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45   'c', AR_CMD_CRE
2a800 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
2a810 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c      { "extract",
2a820 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45     'x', AR_CMD_E
2a830 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d  XTRACT,      0 }
2a840 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65 72 74 22  ,.    { "insert"
2a850 2c 20 20 20 20 27 69 27 2c 20 41 52 5f 43 4d 44  ,    'i', AR_CMD
2a860 5f 49 4e 53 45 52 54 2c 20 20 20 20 20 20 20 30  _INSERT,       0
2a870 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22   },.    { "list"
2a880 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43  ,      't', AR_C
2a890 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20  MD_LIST,        
2a8a0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64   0 },.    { "upd
2a8b0 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52  ate",    'u', AR
2a8c0 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20  _CMD_UPDATE,    
2a8d0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68     0 },.    { "h
2a8e0 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20  elp",      'h', 
2a8f0 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20  AR_CMD_HELP,    
2a900 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
2a910 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27  "verbose",   'v'
2a920 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  , AR_SWITCH_VERB
2a930 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  OSE,   0 },.    
2a940 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27  { "file",      '
2a950 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49  f', AR_SWITCH_FI
2a960 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20  LE,      1 },.  
2a970 20 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20    { "append",   
2a980 20 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'a', AR_SWITCH_
2a990 41 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a  APPEND,    1 },.
2a9a0 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79      { "directory
2a9b0 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43  ", 'C', AR_SWITC
2a9c0 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d  H_DIRECTORY, 1 }
2a9d0 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22  ,.    { "dryrun"
2a9e0 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49  ,    'n', AR_SWI
2a9f0 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30  TCH_DRYRUN,    0
2aa00 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e   },.  };.  int n
2aa10 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28  Switch = sizeof(
2aa20 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f  aSwitch) / sizeo
2aa30 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63  f(struct ArSwitc
2aa40 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53  h);.  struct ArS
2aa50 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61  witch *pEnd = &a
2aa60 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b  Switch[nSwitch];
2aa70 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20  ..  if( nArg<=1 
2aa80 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2aa90 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e  tf(stderr, "Wron
2aaa0 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
2aab0 6d 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e  ments.  Usage:\n
2aac0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  ");.    return a
2aad0 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a  rUsage(stderr);.
2aae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
2aaf0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  r *z = azArg[1];
2ab00 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
2ab10 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  -' ){.      /* T
2ab20 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65  raditional style
2ab30 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f   [tar] invocatio
2ab40 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
2ab50 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  ;.      int iArg
2ab60 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 2;.      for(
2ab70 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
2ab80 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2ab90 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20  har *zArg = 0;. 
2aba0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
2abb0 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
2abc0 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
2abd0 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
2abe0 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
2abf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
2ac00 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74  i]==pOpt->cShort
2ac10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2ac20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ac30 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
2ac40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2ac50 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2ac60 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2ac70 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
2ac80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ac90 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
2aca0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  g ){.          i
2acb0 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b  f( iArg>=nArg ){
2acc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2acd0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2ace0 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  Ar, "option requ
2acf0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
2ad00 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20  : %c",z[i]);.   
2ad10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ad20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
2ad30 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  iArg++];.       
2ad40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
2ad50 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
2ad60 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
2ad70 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
2ad80 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2ad90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
2ada0 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
2adb0 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Arg;.      if( p
2adc0 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20  Ar->nArg>0 ){.  
2add0 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
2ade0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
2adf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ae00 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e  se{.      /* Non
2ae10 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76  -traditional inv
2ae20 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
2ae30 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20   int iArg;.     
2ae40 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72   for(iArg=1; iAr
2ae50 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b  g<nArg; iArg++){
2ae60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
2ae70 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72          z = azAr
2ae80 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
2ae90 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
2aea0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
2aeb0 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
2aec0 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20  mand line words 
2aed0 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
2aee0 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ments. */.      
2aef0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2af00 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
2af10 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
2af20 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
2af30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2af40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2af50 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
2af60 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  z);..        if(
2af70 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[1]!='-' ){.  
2af80 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2af90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2afa0 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70  or more short op
2afb0 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  tions */.       
2afc0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b     for(i=1; i<n;
2afd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2afe0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2aff0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
2b000 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
2b010 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
2b020 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
2b030 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
2b040 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
2b050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b060 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e  if( z[i]==pOpt->
2b070 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a  cShort ) break;.
2b080 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2b0a0 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
2b0b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2b0c0 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2b0d0 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
2b0e0 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d  ption: %c", z[i]
2b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2b100 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b110 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20   pOpt->bArg ){. 
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2b130 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20   i<(n-1) ){.    
2b140 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
2b150 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20   = &z[i+1];.    
2b160 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
2b170 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2b180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b190 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2b1a0 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2b1d0 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
2b1e0 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
2b1f0 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b210 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2b220 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b    zArg = azArg[+
2b230 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  +iArg];.        
2b240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b260 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
2b270 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d  witch(pAr, pOpt-
2b280 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2b290 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b2a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
2b2b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b2c0 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20   if( z[2]=='\0' 
2b2d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b2e0 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64  A -- option, ind
2b2f0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c  icating that all
2b300 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
2b310 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20  nd line words.  
2b320 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63          ** are c
2b330 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2b340 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2b350 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a  pAr->azArg = &az
2b360 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20  Arg[iArg+1];.   
2b370 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
2b380 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a   = nArg-iArg-1;.
2b390 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2b3a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
2b3c0 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ong option */.  
2b3d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2b3e0 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20  ar *zArg = 0;   
2b3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
2b400 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e  ument for option
2b410 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20  , if any */.    
2b420 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2b430 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20  witch *pMatch = 
2b440 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68  0;      /* Match
2b450 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ing option */.  
2b460 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2b470 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20  rSwitch *pOpt;  
2b480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2b490 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
2b4a0 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
2b4b0 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
2b4c0 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
2b4d0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2b4e0 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70  har *zLong = pOp
2b4f0 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20  t->zLong;.      
2b500 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c        if( (n-2)<
2b510 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29  =strlen30(zLong)
2b520 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a   && 0==memcmp(&z
2b530 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29  [2], zLong, n-2)
2b540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b550 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b570 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2b580 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75  g(pAr, "ambiguou
2b590 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29  s option: %s",z)
2b5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b5c0 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
2b5d0 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
2b5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b5f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b600 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b610 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Match==0 ){.    
2b620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2b630 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2b640 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2b650 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ion: %s", z);.  
2b660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b670 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e      if( pMatch->
2b680 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
2b690 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
2b6a0 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
2b6b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2b6c0 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2b6d0 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
2b6e0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22  an argument: %s"
2b6f0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
2b700 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b710 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
2b720 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
2b730 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2b740 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
2b750 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77  pAr, pMatch->eSw
2b760 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
2b770 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2b780 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2b790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2b7a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b7b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2b7c0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2b7d0 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75  es that all argu
2b7e0 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65  ments within the
2b7f0 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67   ArCommand.azArg
2b800 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65  [].** array refe
2b810 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d  r to archive mem
2b820 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65  bers, as for the
2b830 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d   --extract or --
2b840 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a  list commands. .
2b850 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61  ** It checks tha
2b860 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61  t each of them a
2b870 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61  re present. If a
2b880 6e 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  ny specified fil
2b890 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73  e is not.** pres
2b8a0 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69  ent in the archi
2b8b0 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ve, an error is 
2b8c0 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72  printed to stder
2b8d0 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a  r and an error.*
2b8e0 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  * code returned.
2b8f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2b900 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67  ll specified arg
2b910 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65  uments are prese
2b920 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63  nt in.** the arc
2b930 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  hive, SQLITE_OK 
2b940 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2b950 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2b960 20 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69   strips any trai
2b970 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74  ling '/' charact
2b980 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72  ers from each ar
2b990 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  gument..** This 
2b9a0 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  is consistent wi
2b9b0 74 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b  th the way the [
2b9c0 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65  tar] command see
2b9d0 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a  ms to work on.**
2b9e0 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69   Linux..*/.stati
2b9f0 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74  c int arCheckEnt
2ba00 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  ries(ArCommand *
2ba10 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pAr){.  int rc =
2ba20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2ba30 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20  ( pAr->nArg ){. 
2ba40 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
2ba50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ba60 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73  Test = 0;..    s
2ba70 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2ba80 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2ba90 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20  &pTest,.        
2baa0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
2bab0 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  M %s WHERE name=
2bac0 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20  $name", .       
2bad0 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a   pAr->zSrcTable.
2bae0 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73      );.    j = s
2baf0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2bb00 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73  meter_index(pTes
2bb10 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20  t, "$name");.   
2bb20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2bb30 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2bb40 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2bb50 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41      char *z = pA
2bb60 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  r->azArg[i];.   
2bb70 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
2bb80 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e  n30(z);.      in
2bb90 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
2bba0 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
2bbb0 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d  [n-1]=='/' ) n--
2bbc0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27  ;.      z[n] = '
2bbd0 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  \0';.      sqlit
2bbe0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65  e3_bind_text(pTe
2bbf0 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51  st, j, z, -1, SQ
2bc00 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
2bc10 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
2bc20 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2bc30 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pTest) ){.     
2bc40 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
2bc50 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2bc60 65 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29  eset(&rc, pTest)
2bc70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2bc80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
2bc90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2bca0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2bcb0 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  r, "not found in
2bcc0 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c   archive: %s\n",
2bcd0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   z);.        rc 
2bce0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2bcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bd00 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2bd10 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d  &rc, pTest);.  }
2bd20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bd30 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20  ./*.** Format a 
2bd40 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2bd50 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67  t can be used ag
2bd60 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72  ainst the "sqlar
2bd70 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64  " table to.** id
2bd80 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69  entify all archi
2bd90 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ve members that 
2bda0 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e  match the comman
2bdb0 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64  d arguments held
2bdc0 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c  .** in (*pAr). L
2bdd0 65 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20  eave this WHERE 
2bde0 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68  clause in (*pzWh
2bdf0 65 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75  ere) before retu
2be00 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61  rning..** The ca
2be10 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
2be20 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c  ble for eventual
2be30 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ly calling sqlit
2be40 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20  e3_free() on.** 
2be50 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70  any non-NULL (*p
2be60 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a  zWhere) value..*
2be70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72  /.static void ar
2be80 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69  WhereClause(.  i
2be90 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f  nt *pRc, .  ArCo
2bea0 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63  mmand *pAr, .  c
2beb0 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20  har **pzWhere   
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bed0 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45  * OUT: New WHERE
2bee0 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   clause */.){.  
2bef0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
2bf00 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
2bf10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2bf20 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20  f( pAr->nArg==0 
2bf30 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20  ){.      zWhere 
2bf40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2bf50 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73  f("1");.    }els
2bf60 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
2bf70 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2bf80 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
2bf90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2bfa0 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20  r->nArg; i++){. 
2bfb0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2bfc0 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
2bfd0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57  g[i];.        zW
2bfe0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
2bff0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2c000 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27    "%z%s name = '
2c010 25 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61  %q' OR substr(na
2c020 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27  me,1,%d) = '%q/'
2c030 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57  ", .          zW
2c040 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73  here, zSep, z, s
2c050 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a  trlen30(z)+1, z.
2c060 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2c070 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30     if( zWhere==0
2c080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
2c090 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2c0a0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  M;.          bre
2c0b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2c0c0 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f        zSep = " O
2c0d0 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  R ";.      }.   
2c0e0 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72   }.  }.  *pzWher
2c0f0 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f  e = zWhere;.}../
2c100 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2c110 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54  ion of .ar "lisT
2c120 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73  " command. .*/.s
2c130 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74  tatic int arList
2c140 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
2c150 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
2c160 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
2c170 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73  ELECT %s FROM %s
2c180 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63   WHERE %s"; .  c
2c190 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
2c1a0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d  s[] = {.    "nam
2c1b0 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28  e",.    "lsmode(
2c1c0 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74  mode), sz, datet
2c1d0 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78  ime(mtime, 'unix
2c1e0 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20  epoch'), name". 
2c1f0 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68   };..  char *zWh
2c200 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ere = 0;.  sqlit
2c210 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
2c220 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2c230 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72  rc = arCheckEntr
2c240 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68  ies(pAr);.  arWh
2c250 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70  ereClause(&rc, p
2c260 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20  Ar, &zWhere);.. 
2c270 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2c280 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2c290 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61  , &pSql, zSql, a
2c2a0 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62  zCols[pAr->bVerb
2c2b0 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ose],.          
2c2c0 20 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e             pAr->
2c2d0 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2c2e0 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  e);.  if( pAr->b
2c2f0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74  DryRun ){.    ut
2c300 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2c310 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2c320 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
2c330 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c340 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2c350 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2c360 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2c370 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
2c380 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73  if( pAr->bVerbos
2c390 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  e ){.        utf
2c3a0 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2c3b0 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20  >out, "%s % 10d 
2c3c0 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %s  %s\n",.    
2c3d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c3e0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2c3f0 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
2c400 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
2c410 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a  _int(pSql, 1), .
2c420 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c430 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2c440 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20  pSql, 2),.      
2c450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2c460 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2c470 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  3).        );.  
2c480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c490 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2c4a0 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2c4b0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
2c4c0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
2c4d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c4e0 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
2c4f0 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2c500 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2c510 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72  zWhere);.  retur
2c520 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2c530 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2c540 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20  f .ar "eXtract" 
2c550 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
2c560 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63  tic int arExtrac
2c570 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61  tCommand(ArComma
2c580 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
2c590 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20  t char *zSql1 = 
2c5a0 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20  .    "SELECT ". 
2c5b0 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61     " ($dir || na
2c5c0 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74  me),".    " writ
2c5d0 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e  efile(($dir || n
2c5e0 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20  ame), %s, mode, 
2c5f0 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52  mtime) ".    "FR
2c600 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29  OM %s WHERE (%s)
2c610 20 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55   AND (data IS NU
2c620 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d  LL OR $dirOnly =
2c630 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e   0)".    " AND n
2c640 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e  ame NOT GLOB '*.
2c650 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f  .[/\\]*'";..  co
2c660 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
2c670 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
2c680 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
2c690 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
2c6a0 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20    "data".  };.. 
2c6b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c6c0 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
2c6d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c6e0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2c6f0 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
2c700 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
2c710 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2c720 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
2c730 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
2c740 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  ey actually exis
2c750 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  t within.  ** th
2c760 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65  e archive before
2c770 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64   proceeding. And
2c780 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45   formulate a WHE
2c790 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a  RE clause to.  *
2c7a0 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a  * match them.  *
2c7b0 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  /.  rc = arCheck
2c7c0 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2c7d0 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2c7e0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2c7f0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2c800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2c810 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
2c820 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
2c830 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
2c840 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
2c850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c860 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
2c870 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
2c880 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
2c890 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
2c8a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
2c8b0 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2c8c0 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
2c8d0 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20  pSql, zSql1, .  
2c8e0 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70      azExtraArg[p
2c8f0 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e  Ar->bZip], pAr->
2c900 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2c910 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
2c920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c930 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
2c940 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2c950 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22  dex(pSql, "$dir"
2c960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
2c970 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
2c980 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  , zDir, -1, SQLI
2c990 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20  TE_STATIC);..   
2c9a0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45   /* Run the SELE
2c9b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69  CT statement twi
2c9c0 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  ce. The first ti
2c9d0 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20  me, writefile() 
2c9e0 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
2c9f0 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65   for all archive
2ca00 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68   members that sh
2ca10 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65  ould be extracte
2ca20 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69  d. The second ti
2ca30 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  me,.    ** only 
2ca40 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
2ca50 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ies. This is bec
2ca60 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61  ause the timesta
2ca70 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  mps for.    ** e
2ca80 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f  xtracted directo
2ca90 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73  ries must be res
2caa0 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72  et after they ar
2cab0 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a  e populated (as.
2cac0 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e      ** populatin
2cad0 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74  g them changes t
2cae0 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20  he timestamp).  
2caf0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2cb00 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
2cb10 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
2cb20 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2cb30 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c  x(pSql, "$dirOnl
2cb40 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y");.      sqlit
2cb50 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
2cb60 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , j, i);.      i
2cb70 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2cb80 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2cb90 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2cba0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
2cbb0 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
2cbc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cbd0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2cbe0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2cbf0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2cc00 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
2cc10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
2cc20 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
2cc30 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
2cc40 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2cc50 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2cc60 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
2cc70 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
2cc80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2cca0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
2ccb0 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20  (&rc, pSql);.   
2ccc0 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2ccd0 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2cce0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
2ccf0 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71  free(zDir);.  sq
2cd00 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
2cd10 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2cd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
2cd30 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2cd40 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20  in zSql.  Or if 
2cd50 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e  doing a --dryrun
2cd60 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69  , merely print i
2cd70 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t out..*/.static
2cd80 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41   int arExecSql(A
2cd90 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
2cda0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
2cdb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
2cdc0 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
2cdd0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
2cde0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2cdf0 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
2ce00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2ce10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
2ce20 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2ce30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2ce40 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53  exec(pAr->db, zS
2ce50 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  ql, 0, 0, &zErr)
2ce60 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  ;.    if( zErr )
2ce70 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2ce80 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52  ntf(stdout, "ERR
2ce90 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  OR: %s\n", zErr)
2cea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ceb0 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
2cec0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2ced0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
2cee0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
2cef0 61 72 20 22 63 72 65 61 74 65 22 2c 20 22 69 6e  ar "create", "in
2cf00 73 65 72 74 22 2c 20 61 6e 64 20 22 75 70 64 61  sert", and "upda
2cf10 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a  te" commands..**
2cf20 0a 2a 2a 20 20 20 20 20 63 72 65 61 74 65 20 20  .**     create  
2cf30 20 20 2d 3e 20 20 20 20 20 43 72 65 61 74 65 20    ->     Create 
2cf40 61 20 6e 65 77 20 53 51 4c 20 61 72 63 68 69 76  a new SQL archiv
2cf50 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72 74 20  e.**     insert 
2cf60 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74     ->     Insert
2cf70 20 6f 72 20 72 65 69 6e 73 65 72 74 20 61 6c 6c   or reinsert all
2cf80 20 66 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a   files listed.**
2cf90 20 20 20 20 20 75 70 64 61 74 65 20 20 20 20 2d       update    -
2cfa0 3e 20 20 20 20 20 49 6e 73 65 72 74 20 66 69 6c  >     Insert fil
2cfb0 65 73 20 74 68 61 74 20 68 61 76 65 20 63 68 61  es that have cha
2cfc0 6e 67 65 64 20 6f 72 20 74 68 61 74 20 77 65 72  nged or that wer
2cfd0 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  e not.**        
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
2cff0 65 76 69 6f 75 73 6c 79 20 69 6e 20 74 68 65 20  eviously in the 
2d000 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43 72  archive.**.** Cr
2d010 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22  eate the "sqlar"
2d020 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2d030 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65  tabase if it doe
2d040 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
2d050 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64  ist..** Then add
2d060 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68   each file in th
2d070 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79  e azFile[] array
2d080 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e   to the archive.
2d090 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20   Directories.** 
2d0a0 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73  are added recurs
2d0b0 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65  ively. If argume
2d0c0 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e  nt bVerbose is n
2d0d0 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61  on-zero, a messa
2d0e0 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64  ge is.** printed
2d0f0 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65   on stdout for e
2d100 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65  ach file archive
2d110 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65  d..**.** The cre
2d120 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74  ate command is t
2d130 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61 74  he same as updat
2d140 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  e, except that i
2d150 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65  t drops.** any e
2d160 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20  xisting "sqlar" 
2d170 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67  table before beg
2d180 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22 69 6e  inning.  The "in
2d190 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  sert" command.**
2d1a0 20 61 6c 77 61 79 73 20 6f 76 65 72 77 72 69 74   always overwrit
2d1b0 65 73 20 65 76 65 72 79 20 66 69 6c 65 20 6e 61  es every file na
2d1c0 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
2d1d0 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20 61  nd-line, where a
2d1e0 73 0a 2a 2a 20 22 75 70 64 61 74 65 22 20 6f 6e  s.** "update" on
2d1f0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 69 66  ly overwrites if
2d200 20 74 68 65 20 73 69 7a 65 20 6f 72 20 6d 74 69   the size or mti
2d210 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61 73 20 63  me or mode has c
2d220 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
2d230 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72  c int arCreateOr
2d240 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20  UpdateCommand(. 
2d250 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2d280 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e  ments and option
2d290 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61  s */.  int bUpda
2d2a0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2d2b0 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66         /* true f
2d2c0 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 2a  or a --create. *
2d2d0 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66 43  /.  int bOnlyIfC
2d2e0 68 61 6e 67 65 64 20 20 20 20 20 20 20 20 20 20  hanged          
2d2f0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64 61      /* Only upda
2d300 74 65 20 69 66 20 66 69 6c 65 20 68 61 73 20 63  te if file has c
2d310 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  hanged */.){.  c
2d320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
2d330 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
2d340 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2d350 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
2d360 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
2d370 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
2d380 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
2d390 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
2d3a0 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
2d3b0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
2d3c0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
2d3d0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
2d3e0 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
2d3f0 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
2d400 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
2d410 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
2d420 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
2d430 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
2d440 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
2d450 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
2d470 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
2d480 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
2d490 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d4a0 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
2d4b0 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
2d4c0 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
2d4d0 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d  r *zInsertFmt[2]
2d4e0 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41   = {.     "REPLA
2d4f0 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c  CE INTO %s(name,
2d500 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61  mode,mtime,sz,da
2d510 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
2d520 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
2d530 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
2d540 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
2d550 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
2d560 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20  .     "    CASE 
2d570 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f  substr(lsmode(mo
2d580 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20  de),1,1)\n".    
2d590 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27   "      WHEN '-'
2d5a0 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74   THEN length(dat
2d5b0 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  a)\n".     "    
2d5c0 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20    WHEN 'd' THEN 
2d5d0 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  0\n".     "     
2d5e0 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22   ELSE -1 END,\n"
2d5f0 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72  .     "    sqlar
2d600 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c  _compress(data)\
2d610 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
2d620 66 73 64 69 72 28 25 51 2c 25 51 29 20 41 53 20  fsdir(%Q,%Q) AS 
2d630 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20  disk\n".     "  
2d640 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64  WHERE lsmode(mod
2d650 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25  e) NOT LIKE '?%%
2d660 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20 20  '%s;".     ,.   
2d670 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
2d680 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  %s(name,mode,mti
2d690 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  me,data)\n".    
2d6a0 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
2d6b0 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
2d6c0 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
2d6d0 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
2d6e0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2d6f0 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20  data\n".     "  
2d700 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
2d710 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20  ) AS disk\n".   
2d720 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64    "  WHERE lsmod
2d730 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45  e(mode) NOT LIKE
2d740 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b 0a   '?%%'%s;".  };.
2d750 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d770 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
2d780 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c  ng through azFil
2d790 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  e[] */.  int rc;
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d7c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn code */.  con
2d7d0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
2d7e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2d7f0 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  SQL table into w
2d800 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a  hich to insert *
2d810 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  /.  char *zSql;.
2d820 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d    char zTemp[50]
2d830 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 69 73 74  ;.  char *zExist
2d840 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65 63  s = 0;..  arExec
2d850 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41  Sql(pAr, "PRAGMA
2d860 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29   page_size=512")
2d870 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53  ;.  rc = arExecS
2d880 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49  ql(pAr, "SAVEPOI
2d890 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20  NT ar;");.  if( 
2d8a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d8b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65  return rc;.  zTe
2d8c0 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66  mp[0] = 0; .  if
2d8d0 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20  ( pAr->bZip ){. 
2d8e0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2d8f0 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72   the zipfile vir
2d900 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e  tual table, if n
2d910 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
2d920 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29  if( pAr->zFile )
2d930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d940 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20  uint64 r;.      
2d950 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2d960 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29  ss(sizeof(r),&r)
2d970 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2d980 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2d990 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69  zTemp),zTemp,"zi
2d9a0 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20  p%016llx",r);.  
2d9b0 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70      zTab = zTemp
2d9c0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
2d9d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2d9e0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
2d9f0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
2da00 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70  emp.%s USING zip
2da10 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20  file(%Q)",.     
2da20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a      zTab, pAr->z
2da30 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  File.      );.  
2da40 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2da50 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
2da60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2da70 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  e(zSql);.    }el
2da80 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  se{.      zTab =
2da90 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20   "zip";.    }.  
2daa0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
2dab0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
2dac0 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20  le for an SQLAR 
2dad0 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73  */.    zTab = "s
2dae0 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62  qlar";.    if( b
2daf0 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  Update==0 ){.   
2db00 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2db10 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20  l(pAr, zDrop);. 
2db20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2db30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2db40 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
2db50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2db60 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2db70 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20  zCreate);.  }.  
2db80 69 66 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67  if( bOnlyIfChang
2db90 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 69 73 74  ed ){.    zExist
2dba0 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
2dbb0 6e 74 66 28 0a 20 20 20 20 20 20 22 20 41 4e 44  ntf(.      " AND
2dbc0 20 4e 4f 54 20 45 58 49 53 54 53 28 22 0a 20 20   NOT EXISTS(".  
2dbd0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2dbe0 31 20 46 52 4f 4d 20 25 73 20 41 53 20 6d 65 6d  1 FROM %s AS mem
2dbf0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48  ".          " WH
2dc00 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69 73  ERE mem.name=dis
2dc10 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20  k.name".        
2dc20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69 6d    " AND mem.mtim
2dc30 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20 20  e=disk.mtime".  
2dc40 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65          " AND me
2dc50 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64 65  m.mode=disk.mode
2dc60 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  )", zTab);.  }el
2dc70 73 65 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20  se{.    zExists 
2dc80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2dc90 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  f("");.  }.  if(
2dca0 20 7a 45 78 69 73 74 73 3d 3d 30 20 29 20 72 63   zExists==0 ) rc
2dcb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2dcc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2dcd0 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53  r->nArg && rc==S
2dce0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
2dcf0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20      char *zSql2 
2dd00 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2dd10 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72  f(zInsertFmt[pAr
2dd20 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20  ->bZip], zTab,. 
2dd30 20 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72         pAr->bVer
2dd40 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75  bose ? "shell_pu
2dd50 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e  tsnl(name)" : "n
2dd60 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41  ame",.        pA
2dd70 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72  r->azArg[i], pAr
2dd80 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74 73 29  ->zDir, zExists)
2dd90 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65  ;.    rc = arExe
2dda0 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29  cSql(pAr, zSql2)
2ddb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2ddc0 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65  ee(zSql2);.  }.e
2ddd0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2dde0 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  n:.  if( rc!=SQL
2ddf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2de00 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e  lite3_exec(pAr->
2de10 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  db, "ROLLBACK TO
2de20 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b   ar; RELEASE ar;
2de30 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
2de40 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2de50 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52  rExecSql(pAr, "R
2de60 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20  ELEASE ar;");.  
2de70 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2de80 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  && pAr->zFile ){
2de90 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2dea0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44  lite3_mprintf("D
2deb0 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ROP TABLE %s", z
2dec0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45  Temp);.      arE
2ded0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2dee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2def0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2df00 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2df10 5f 66 72 65 65 28 7a 45 78 69 73 74 73 29 3b 0a  _free(zExists);.
2df20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2df30 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2df40 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f  tion of ".ar" do
2df50 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
2df60 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f  atic int arDotCo
2df70 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
2df80 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
2df90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2dfa0 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
2dfb0 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72  tate */.  int fr
2dfc0 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20  omCmdLine,      
2dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2dfe0 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d  e if -A command-
2dff0 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74  line option, not
2e000 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63 68   .ar cmd */.  ch
2e010 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e030 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
2e040 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
2e050 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
2e060 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e080 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2e090 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
2e0a0 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  /.){.  ArCommand
2e0b0 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   cmd;.  int rc;.
2e0c0 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30    memset(&cmd, 0
2e0d0 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a  , sizeof(cmd));.
2e0e0 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e    cmd.fromCmdLin
2e0f0 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b  e = fromCmdLine;
2e100 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65 43  .  rc = arParseC
2e110 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41  ommand(azArg, nA
2e120 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28  rg, &cmd);.  if(
2e130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e140 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79 70  {.    int eDbTyp
2e150 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  e = SHELL_OPEN_U
2e160 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70  NSPEC;.    cmd.p
2e170 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63   = pState;.    c
2e180 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e  md.db = pState->
2e190 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e  db;.    if( cmd.
2e1a0 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65  zFile ){.      e
2e1b0 44 62 54 79 70 65 20 3d 20 64 65 64 75 63 65 44  DbType = deduceD
2e1c0 61 74 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e  atabaseType(cmd.
2e1d0 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d  zFile, 1);.    }
2e1e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54  else{.      eDbT
2e1f0 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70  ype = pState->op
2e200 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20  enMode;.    }.  
2e210 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53    if( eDbType==S
2e220 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
2e230 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  E ){.      if( c
2e240 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2e250 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65  EXTRACT || cmd.e
2e260 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54  Cmd==AR_CMD_LIST
2e270 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e280 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  cmd.zFile==0 ){.
2e290 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53            cmd.zS
2e2a0 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
2e2b0 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29  3_mprintf("zip")
2e2c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2e2d0 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  .          cmd.z
2e2e0 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
2e2f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66  e3_mprintf("zipf
2e300 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46  ile(%Q)", cmd.zF
2e310 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ile);.        }.
2e320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2e330 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20  d.bZip = 1;.    
2e340 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46  }else if( cmd.zF
2e350 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ile ){.      int
2e360 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66   flags;.      if
2e370 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20  ( cmd.bAppend ) 
2e380 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f  eDbType = SHELL_
2e390 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
2e3a0 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2e3b0 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md==AR_CMD_CREAT
2e3c0 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  E || cmd.eCmd==A
2e3d0 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20 20  R_CMD_INSERT .  
2e3e0 20 20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64 2e           || cmd.
2e3f0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
2e400 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ATE ){.        f
2e410 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
2e420 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2e430 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
2e440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e450 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51        flags = SQ
2e460 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e470 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
2e480 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20    cmd.db = 0;.  
2e490 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79      if( cmd.bDry
2e4a0 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2e4b0 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74  tf8_printf(pStat
2e4c0 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e  e->out, "-- open
2e4d0 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73   database '%s'%s
2e4e0 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a  \n", cmd.zFile,.
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62               eDb
2e500 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2e510 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75  _APPENDVFS ? " u
2e520 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20  sing 'apndvfs'" 
2e530 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  : "");.      }. 
2e540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e550 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46  3_open_v2(cmd.zF
2e560 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c  ile, &cmd.db, fl
2e570 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ags, .          
2e580 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c     eDbType==SHEL
2e590 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2e5a0 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30   ? "apndvfs" : 0
2e5b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2e5c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e5d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2e5e0 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
2e5f0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20  t open file: %s 
2e600 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20  (%s)\n", .      
2e610 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c        cmd.zFile,
2e620 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2e630 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20  cmd.db).        
2e640 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2e650 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2e660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2e670 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
2e680 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b  t(cmd.db, 0, 0);
2e690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2e6a0 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62  qlar_init(cmd.db
2e6b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2e6c0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2e6d0 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22  nction(cmd.db, "
2e6e0 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
2e6f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63  , SQLITE_UTF8, c
2e700 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20  md.p,.          
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e      shellPutsFun
2e730 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d  c, 0, 0);..    }
2e740 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72  .    if( cmd.zSr
2e750 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64  cTable==0 && cmd
2e760 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e  .bZip==0 && cmd.
2e770 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c  eCmd!=AR_CMD_HEL
2e780 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  P ){.      if( c
2e790 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2e7a0 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26 26  CREATE.       &&
2e7b0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
2e7c0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63  olumn_metadata(c
2e7d0 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c  md.db,0,"sqlar",
2e7e0 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30  "name",0,0,0,0,0
2e7f0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2e800 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e810 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73 65  tderr, "database
2e820 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2e830 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62  n an 'sqlar' tab
2e840 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  le\n");.        
2e850 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2e860 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
2e870 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2e880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2e890 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2e8a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73  lite3_mprintf("s
2e8b0 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  qlar");.    }.. 
2e8c0 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65     switch( cmd.e
2e8d0 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73  Cmd ){.      cas
2e8e0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
2e8f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2e900 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2e910 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20 30  mmand(&cmd, 0, 0
2e920 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2e930 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2e940 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
2e950 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74        rc = arExt
2e960 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  ractCommand(&cmd
2e970 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2e980 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2e990 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20  _CMD_LIST:.     
2e9a0 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f     rc = arListCo
2e9b0 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20  mmand(&cmd);.   
2e9c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2e9d0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48     case AR_CMD_H
2e9e0 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55  ELP:.        arU
2e9f0 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74  sage(pState->out
2ea00 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2ea10 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2ea20 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20  _CMD_INSERT:.   
2ea30 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2ea40 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2ea50 64 28 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a 20  d(&cmd, 1, 0);. 
2ea60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2ea70 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2ea80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 6d        assert( cm
2ea90 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55  d.eCmd==AR_CMD_U
2eaa0 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20  PDATE );.       
2eab0 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72   rc = arCreateOr
2eac0 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63  UpdateCommand(&c
2ead0 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  md, 1, 1);.     
2eae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2eaf0 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61    }.end_ar_comma
2eb00 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62  nd:.  if( cmd.db
2eb10 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a  !=pState->db ){.
2eb20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64      close_db(cmd
2eb30 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  .db);.  }.  sqli
2eb40 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72  te3_free(cmd.zSr
2eb50 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75  cTable);..  retu
2eb60 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20  rn rc;.}./* End 
2eb70 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65  of the ".archive
2eb80 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
2eb90 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a  nd logic.*******
2eba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ebb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ebc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ebd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ebe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
2ebf0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2ec00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2ec10 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2ec20 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2ec30 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 73 74 61 74 69  _ZLIB) */..stati
2ec40 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63  c void shellExec
2ec50 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2ec60 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
2ec70 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
2ec80 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66   rc = *pRc;.  if
2ec90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2eca0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  ){.    char *zEr
2ecb0 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
2ecc0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2ecd0 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45   zSql, 0, 0, &zE
2ece0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rr);.    if( rc!
2ecf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ed00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ed10 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
2ed20 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  r: %s\n", zErr);
2ed30 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
2ed40 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  = rc;.  }.}..sta
2ed50 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 78  tic void shellEx
2ed60 65 63 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33  ecPrintf(sqlite3
2ed70 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20   *db, int *pRc, 
2ed80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
2ed90 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
2eda0 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  z = 0;.  if( *pR
2edb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2edc0 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
2edd0 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
2ede0 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20   zFmt);.    z = 
2edf0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2ee00 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
2ee10 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
2ee20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2ee30 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2ee40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2ee50 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 45 78 65  {.      shellExe
2ee60 63 28 64 62 2c 20 70 52 63 2c 20 7a 29 3b 0a 20  c(db, pRc, z);. 
2ee70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ee80 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
2ee90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 68  .static void *sh
2eea0 65 6c 6c 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70  ellMalloc(int *p
2eeb0 52 63 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Rc, sqlite3_int6
2eec0 34 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  4 nByte){.  void
2eed0 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
2eee0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2eef0 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  K ){.    pRet = 
2ef00 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
2ef10 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
2ef20 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
2ef30 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2ef40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2ef50 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
2ef60 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
2ef70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ef80 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn pRet;.}..stat
2ef90 69 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50  ic char *shellMP
2efa0 72 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20  rintf(int *pRc, 
2efb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
2efc0 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
2efd0 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  z = 0;.  if( *pR
2efe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2eff0 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
2f000 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
2f010 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20   zFmt);.    z = 
2f020 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2f030 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
2f040 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
2f050 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2f060 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2f070 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2f080 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
2f090 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52  typedef struct R
2f0a0 65 63 6f 76 65 72 54 61 62 6c 65 20 52 65 63 6f  ecoverTable Reco
2f0b0 76 65 72 54 61 62 6c 65 3b 0a 73 74 72 75 63 74  verTable;.struct
2f0c0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 7b 0a   RecoverTable {.
2f0d0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
2f100 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 51  le */.  char *zQ
2f110 75 6f 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  uoted;          
2f120 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65          /* Quote
2f130 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 7a 4e 61  d version of zNa
2f140 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  me */.  int nCol
2f150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f160 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f170 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
2f180 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
2f190 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20 20 20 20 20  **azlCol;       
2f1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
2f1b0 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6c 69  ray of column li
2f1c0 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b  sts */.  int iPk
2f1d0 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.};../*.** Free
2f1e0 20 61 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20   a RecoverTable 
2f1f0 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
2f200 20 62 79 20 72 65 63 6f 76 65 72 4e 65 77 54 61   by recoverNewTa
2f210 62 6c 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ble().*/.static 
2f220 76 6f 69 64 20 72 65 63 6f 76 65 72 46 72 65 65  void recoverFree
2f230 54 61 62 6c 65 28 52 65 63 6f 76 65 72 54 61 62  Table(RecoverTab
2f240 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 66 28  le *pTab){.  if(
2f250 20 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c   pTab ){.    sql
2f260 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
2f270 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2f280 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 7a  te3_free(pTab->z
2f290 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 69 66 28  Quoted);.    if(
2f2a0 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 29 7b   pTab->azlCol ){
2f2b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2f2c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2f2d0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2f2e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f2f0 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43  _free(pTab->azlC
2f300 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ol[i]);.      }.
2f310 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f320 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 29  ee(pTab->azlCol)
2f330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2f340 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a  te3_free(pTab);.
2f350 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2f360 69 64 20 72 65 63 6f 76 65 72 4f 6c 64 54 61 62  id recoverOldTab
2f370 6c 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  le(.  int *pRc, 
2f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f390 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2f3a0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
2f3b0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70   RecoverTable *p
2f3c0 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
2f3d0 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
2f3e0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f3f0 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  f table */.  con
2f400 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
2f410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f420 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
2f430 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
2f440 62 49 6e 74 6b 65 79 2c 20 0a 20 20 69 6e 74 20  bIntkey, .  int 
2f450 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  nCol.){.  sqlite
2f460 33 20 2a 64 62 74 6d 70 20 3d 20 30 3b 20 20 20  3 *dbtmp = 0;   
2f470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2f480 69 74 65 33 20 68 61 6e 64 6c 65 20 66 6f 72 20  ite3 handle for 
2f490 74 65 73 74 69 6e 67 20 43 52 45 41 54 45 20 54  testing CREATE T
2f4a0 41 42 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ABLE */.  int rc
2f4b0 20 3d 20 2a 70 52 63 3b 0a 0a 20 20 69 66 28 20   = *pRc;..  if( 
2f4c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f4d0 0a 20 20 20 20 69 6e 74 20 6e 53 71 6c 43 6f 6c  .    int nSqlCol
2f4e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 53   = 0;.    int bS
2f4f0 71 6c 49 6e 74 6b 65 79 20 3d 20 30 3b 0a 20 20  qlIntkey = 0;.  
2f500 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2f510 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pStmt = 0;..    
2f520 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2f530 6e 28 22 22 2c 20 26 64 62 74 6d 70 29 3b 0a 20  n("", &dbtmp);. 
2f540 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2f560 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f570 64 62 74 6d 70 2c 20 22 50 52 41 47 4d 41 20 77  dbtmp, "PRAGMA w
2f580 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
2f590 20 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   on", 0, 0, 0);.
2f5a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2f5b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f5c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f5d0 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20 7a 53  3_exec(dbtmp, zS
2f5e0 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
2f5f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f600 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  TE_ERROR ){.    
2f610 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f620 4f 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OK;.        goto
2f630 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20   finished;.     
2f640 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65   }.    }.    she
2f650 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
2f660 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74  dbtmp, &rc, &pSt
2f670 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45  mt, .        "SE
2f680 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2f690 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
2f6a0 69 6e 66 6f 28 25 51 29 22 2c 20 7a 4e 61 6d 65  info(%Q)", zName
2f6b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2f6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f6d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2f6e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2f6f0 20 29 7b 0a 20 20 20 20 20 20 6e 53 71 6c 43 6f   ){.      nSqlCo
2f700 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
2f710 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
2f720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  ;.    }.    shel
2f730 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
2f740 53 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  Stmt);..    if( 
2f750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2f760 20 6e 53 71 6c 43 6f 6c 3c 6e 43 6f 6c 20 29 7b   nSqlCol<nCol ){
2f770 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
2f780 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
2f790 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2f7a0 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c 20  ntf(dbtmp, &rc, 
2f7b0 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 22  &pStmt, .      "
2f7c0 53 45 4c 45 43 54 20 28 22 0a 20 20 20 20 20 20  SELECT (".      
2f7d0 22 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72  "  SELECT substr
2f7e0 28 64 61 74 61 2c 31 2c 31 29 3d 3d 58 27 30 44  (data,1,1)==X'0D
2f7f0 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  ' FROM sqlite_db
2f800 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d  page WHERE pgno=
2f810 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20  rootpage".      
2f820 22 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ") FROM sqlite_m
2f830 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
2f840 20 3d 20 25 51 22 2c 20 7a 4e 61 6d 65 0a 20 20   = %Q", zName.  
2f850 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
2f860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2f870 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2f880 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
2f890 0a 20 20 20 20 20 20 62 53 71 6c 49 6e 74 6b 65  .      bSqlIntke
2f8a0 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  y = sqlite3_colu
2f8b0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
2f8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  ;.    }.    shel
2f8d0 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
2f8e0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  Stmt);..    if( 
2f8f0 62 49 6e 74 6b 65 79 3d 3d 62 53 71 6c 49 6e 74  bIntkey==bSqlInt
2f900 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  key ){.      con
2f910 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22  st char *zPk = "
2f920 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20 20  _rowid_";.      
2f930 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50  sqlite3_stmt *pP
2f940 6b 46 69 6e 64 65 72 20 3d 20 30 3b 0a 0a 20 20  kFinder = 0;..  
2f950 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
2f960 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72  Printf(dbtmp, &r
2f970 63 2c 20 26 70 50 6b 46 69 6e 64 65 72 2c 20 0a  c, &pPkFinder, .
2f980 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
2f990 54 20 63 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d  T cid, name FROM
2f9a0 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
2f9b0 66 6f 28 25 51 29 20 22 0a 20 20 20 20 20 20 20  fo(%Q) ".       
2f9c0 20 20 20 22 20 20 57 48 45 52 45 20 70 6b 3d 31     "  WHERE pk=1
2f9d0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 74 65 67   AND type='integ
2f9e0 65 72 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  er' COLLATE noca
2f9f0 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  se".          " 
2fa00 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 20   AND NOT EXISTS 
2fa10 28 53 45 4c 45 43 54 20 63 69 64 20 46 52 4f 4d  (SELECT cid FROM
2fa20 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
2fa30 66 6f 28 25 51 29 20 57 48 45 52 45 20 70 6b 3d  fo(%Q) WHERE pk=
2fa40 32 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  2)",.          z
2fa50 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Name, zName.    
2fa60 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
2fa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fa80 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2fa90 74 65 33 5f 73 74 65 70 28 70 50 6b 46 69 6e 64  te3_step(pPkFind
2faa0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  er) ){.        p
2fab0 54 61 62 2d 3e 69 50 6b 20 3d 20 73 71 6c 69 74  Tab->iPk = sqlit
2fac0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50  e3_column_int(pP
2fad0 6b 46 69 6e 64 65 72 2c 20 30 29 3b 0a 20 20 20  kFinder, 0);.   
2fae0 20 20 20 20 20 7a 50 6b 20 3d 20 28 63 6f 6e 73       zPk = (cons
2faf0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2fb00 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 50 6b 46  column_text(pPkF
2fb10 69 6e 64 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  inder, 1);.     
2fb20 20 7d 0a 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   }..      pTab->
2fb30 7a 4e 61 6d 65 20 3d 20 73 68 65 6c 6c 4d 50 72  zName = shellMPr
2fb40 69 6e 74 66 28 26 72 63 2c 20 22 25 73 22 2c 20  intf(&rc, "%s", 
2fb50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 54  zName);.      pT
2fb60 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68  ab->zQuoted = sh
2fb70 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20  ellMPrintf(&rc, 
2fb80 22 25 51 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  "%Q", pTab->zNam
2fb90 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  e);.      pTab->
2fba0 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a  azlCol = (char**
2fbb0 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63  )shellMalloc(&rc
2fbc0 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
2fbd0 2a 20 6e 53 71 6c 43 6f 6c 29 3b 0a 20 20 20 20  * nSqlCol);.    
2fbe0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e    pTab->nCol = n
2fbf0 53 71 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 69  SqlCol;..      i
2fc00 66 28 20 6e 53 71 6c 43 6f 6c 3d 3d 31 20 26 26  f( nSqlCol==1 &&
2fc10 20 70 54 61 62 2d 3e 69 50 6b 3d 3d 30 20 29 7b   pTab->iPk==0 ){
2fc20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
2fc30 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c  zlCol[0] = shell
2fc40 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25 51  MPrintf(&rc, "%Q
2fc50 22 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d  ", zPk);.      }
2fc60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 68  else{.        sh
2fc70 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2fc80 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53  (dbtmp, &rc, &pS
2fc90 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tmt, .          
2fca0 22 53 45 4c 45 43 54 20 2d 31 2b 72 6f 77 5f 6e  "SELECT -1+row_n
2fcb0 75 6d 62 65 72 28 29 20 20 20 20 20 20 20 20 20  umber()         
2fcc0 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
2fcd0 63 69 64 29 2c 22 0a 20 20 20 20 20 20 20 20 20  cid),".         
2fce0 20 22 20 20 20 20 25 51 7c 7c 25 51 7c 7c 67 72   "    %Q||%Q||gr
2fcf0 6f 75 70 5f 63 6f 6e 63 61 74 28 6e 61 6d 65 2c  oup_concat(name,
2fd00 20 27 2c 20 27 29 20 46 49 4c 54 45 52 20 28 57   ', ') FILTER (W
2fd10 48 45 52 45 20 63 69 64 21 3d 25 64 29 20 22 0a  HERE cid!=%d) ".
2fd20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
2fd30 20 20 20 20 20 20 4f 56 45 52 20 28 4f 52 44 45        OVER (ORDE
2fd40 52 20 42 59 20 63 69 64 29 20 22 0a 20 20 20 20  R BY cid) ".    
2fd50 20 20 20 20 20 20 22 46 52 4f 4d 20 70 72 61 67        "FROM prag
2fd60 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51  ma_table_info(%Q
2fd70 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  )", .          (
2fd80 62 49 6e 74 6b 65 79 20 3f 20 7a 50 6b 20 3a 20  bIntkey ? zPk : 
2fd90 22 22 29 2c 20 28 62 49 6e 74 6b 65 79 20 3f 20  ""), (bIntkey ? 
2fda0 22 2c 20 22 20 3a 20 22 22 29 2c 20 0a 20 20 20  ", " : ""), .   
2fdb0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 6b         pTab->iPk
2fdc0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  , zName.        
2fdd0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
2fde0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fdf0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2fe00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2fe10 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
2fe20 69 6e 74 20 69 64 78 20 3d 20 73 71 6c 69 74 65  int idx = sqlite
2fe30 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2fe40 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
2fe50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2fe60 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
2fe70 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
2fe80 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
2fe90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ;.          pTab
2fea0 2d 3e 61 7a 6c 43 6f 6c 5b 69 64 78 5d 20 3d 20  ->azlCol[idx] = 
2feb0 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63  shellMPrintf(&rc
2fec0 2c 20 22 25 73 22 2c 20 7a 54 65 78 74 29 3b 0a  , "%s", zText);.
2fed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fee0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2fef0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  &rc, pStmt);.   
2ff00 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c     }.      shell
2ff10 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50  Finalize(&rc, pP
2ff20 6b 46 69 6e 64 65 72 29 3b 0a 20 20 20 20 7d 0a  kFinder);.    }.
2ff30 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a    }.. finished:.
2ff40 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2ff50 64 62 74 6d 70 29 3b 0a 20 20 2a 70 52 63 20 3d  dbtmp);.  *pRc =
2ff60 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 52   rc;.}..static R
2ff70 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63  ecoverTable *rec
2ff80 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 0a 20 20  overNewTable(.  
2ff90 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
2ffa0 74 65 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  te, .  int *pRc,
2ffb0 0a 20 20 69 6e 74 20 69 52 6f 6f 74 2c 0a 20 20  .  int iRoot,.  
2ffc0 69 6e 74 20 62 49 6e 74 6b 65 79 2c 0a 20 20 69  int bIntkey,.  i
2ffd0 6e 74 20 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c  nt nCol.){.  sql
2ffe0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2fff0 20 3d 20 30 3b 0a 20 20 52 65 63 6f 76 65 72 54   = 0;.  RecoverT
30000 61 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a  able *pRet = 0;.
30010 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b    int bNoop = 0;
30020 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30030 53 71 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Sql = 0;.  const
30040 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
30050 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 52 65 63  ;..  pRet = (Rec
30060 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c  overTable*)shell
30070 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65  Malloc(pRc, size
30080 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65 29  of(RecoverTable)
30090 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 20  );.  if( pRet ) 
300a0 70 52 65 74 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a  pRet->iPk = -2;.
300b0 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65  .  /* Search the
300c0 20 72 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d   recovered schem
300d0 61 20 66 6f 72 20 61 6e 20 6f 62 6a 65 63 74 20  a for an object 
300e0 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69  with root page i
300f0 52 6f 6f 74 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c  Root. */.  shell
30100 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 53  PreparePrintf(pS
30110 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c 20 26  tate->db, pRc, &
30120 70 53 74 6d 74 2c 0a 20 20 20 20 20 20 22 53 45  pStmt,.      "SE
30130 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c  LECT type, name,
30140 20 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65   sql FROM recove
30150 72 79 2e 73 63 68 65 6d 61 20 57 48 45 52 45 20  ry.schema WHERE 
30160 72 6f 6f 74 70 61 67 65 3d 25 64 22 2c 20 69 52  rootpage=%d", iR
30170 6f 6f 74 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  oot.  );.  while
30180 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
30190 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
301a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
301b0 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  tmt) ){.    cons
301c0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
301d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
301e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
301f0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
30200 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d 30 20 26  if( bIntkey==0 &
30210 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
30220 70 28 7a 54 79 70 65 2c 20 22 69 6e 64 65 78 22  p(zType, "index"
30230 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 4e  )==0 ){.      bN
30240 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  oop = 1;.      b
30250 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
30260 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
30270 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
30280 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
30290 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
302a0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
302b0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
302c0 31 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  1);.      zSql =
302d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
302e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
302f0 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
30300 20 20 20 72 65 63 6f 76 65 72 4f 6c 64 54 61 62     recoverOldTab
30310 6c 65 28 70 52 63 2c 20 70 52 65 74 2c 20 7a 4e  le(pRc, pRet, zN
30320 61 6d 65 2c 20 7a 53 71 6c 2c 20 62 49 6e 74 6b  ame, zSql, bIntk
30330 65 79 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ey, nCol);.     
30340 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30350 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  }.  shellFinaliz
30360 65 28 70 52 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(pRc, pStmt);. 
30370 20 69 66 28 20 62 4e 6f 6f 70 20 29 7b 0a 20 20   if( bNoop ){.  
30380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
30390 52 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ret);.    return
303a0 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
303b0 52 65 74 20 26 26 20 70 52 65 74 2d 3e 7a 4e 61  Ret && pRet->zNa
303c0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  me==0 ){.    sql
303d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
303e0 20 3d 20 30 3b 0a 0a 20 20 20 20 70 52 65 74 2d   = 0;..    pRet-
303f0 3e 7a 4e 61 6d 65 20 3d 20 73 68 65 6c 6c 4d 50  >zName = shellMP
30400 72 69 6e 74 66 28 70 52 63 2c 20 22 6f 72 70 68  rintf(pRc, "orph
30410 61 6e 5f 25 64 5f 25 64 22 2c 20 6e 43 6f 6c 2c  an_%d_%d", nCol,
30420 20 69 52 6f 6f 74 29 3b 0a 20 20 20 20 70 52 65   iRoot);.    pRe
30430 74 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65  t->zQuoted = she
30440 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22  llMPrintf(pRc, "
30450 25 51 22 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65  %Q", pRet->zName
30460 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 61 7a 6c  );.    pRet->azl
30470 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73 68  Col = (char**)sh
30480 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73  ellMalloc(pRc, s
30490 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e  izeof(char*) * n
304a0 43 6f 6c 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e  Col);.    pRet->
304b0 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  nCol = nCol;..  
304c0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
304d0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
304e0 20 70 52 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   pRc, &pStmt, . 
304f0 20 20 20 20 20 22 57 49 54 48 20 73 28 69 29 20       "WITH s(i) 
30500 41 53 20 28 22 0a 20 20 20 20 20 20 22 20 20 53  AS (".      "  S
30510 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c  ELECT 1 UNION AL
30520 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f  L SELECT i+1 FRO
30530 4d 20 73 20 57 48 45 52 45 20 69 3c 25 64 22 0a  M s WHERE i<%d".
30540 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20        ")".      
30550 22 53 45 4c 45 43 54 20 69 2d 31 2c 20 25 51 20  "SELECT i-1, %Q 
30560 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
30570 27 63 27 20 7c 7c 20 69 2c 20 27 2c 20 27 29 20  'c' || i, ', ') 
30580 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20 69  OVER (ORDER BY i
30590 29 20 46 52 4f 4d 20 73 22 2c 0a 20 20 20 20 20  ) FROM s",.     
305a0 20 6e 43 6f 6c 2c 20 28 62 49 6e 74 6b 65 79 20   nCol, (bIntkey 
305b0 3f 20 22 69 64 2c 20 22 20 3a 20 22 22 29 0a 20  ? "id, " : ""). 
305c0 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28     );.    while(
305d0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
305e0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
305f0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
30600 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  mt) ){.      int
30610 20 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   idx = sqlite3_c
30620 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
30630 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   0);.      const
30640 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
30650 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
30660 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
30670 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
30680 20 70 52 65 74 2d 3e 61 7a 6c 43 6f 6c 5b 69 64   pRet->azlCol[id
30690 78 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  x] = shellMPrint
306a0 66 28 70 52 63 2c 20 22 25 73 22 2c 20 7a 54 65  f(pRc, "%s", zTe
306b0 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xt);.    }.    s
306c0 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63  hellFinalize(pRc
306d0 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 69  , pStmt);..    i
306e0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
306f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  OK ){.      char
30700 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 68 65 6c   *zCreate = shel
30710 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 43  lMPrintf(pRc, "C
30720 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 20 28  REATE TABLE %Q (
30730 25 73 29 22 2c 20 0a 20 20 20 20 20 20 20 20 70  %s)", .        p
30740 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 70 52 65 74  Ret->zName, pRet
30750 2d 3e 61 7a 6c 43 6f 6c 5b 6e 43 6f 6c 2d 31 5d  ->azlCol[nCol-1]
30760 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
30770 69 66 28 20 7a 43 72 65 61 74 65 20 29 7b 0a 20  if( zCreate ){. 
30780 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
30790 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
307a0 25 73 3b 5c 6e 22 2c 20 7a 43 72 65 61 74 65 29  %s;\n", zCreate)
307b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
307c0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
307d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
307e0 20 7d 0a 0a 20 20 69 66 28 20 2a 70 52 63 21 3d   }..  if( *pRc!=
307f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30800 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
30810 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65  e(pRet);.    pRe
30820 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
30830 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
30840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30850 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
30860 65 63 6f 76 65 72 20 64 61 74 61 20 66 72 6f 6d  ecover data from
30870 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
30880 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f 20 63 6f   script.** to co
30890 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 64 61  nstruct a new da
308a0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
308b0 67 20 61 6c 6c 20 72 65 63 6f 76 65 72 65 64 20  g all recovered 
308c0 64 61 74 61 20 69 73 20 6f 75 74 70 75 74 0a 2a  data is output.*
308d0 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70 53 74 61  * on stream pSta
308e0 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  te->out..*/.stat
308f0 69 63 20 69 6e 74 20 72 65 63 6f 76 65 72 44 61  ic int recoverDa
30900 74 61 62 61 73 65 43 6d 64 28 53 68 65 6c 6c 53  tabaseCmd(ShellS
30910 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 69 6e  tate *pState, in
30920 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
30930 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  zArg){.  int rc 
30940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
30950 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 6f  qlite3_stmt *pLo
30960 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  op = 0;        /
30970 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
30980 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  ll root pages */
30990 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
309a0 2a 70 50 61 67 65 73 20 3d 20 30 3b 20 20 20 20  *pPages = 0;    
309b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
309c0 67 68 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  gh all pages in 
309d0 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20 73 71 6c  a group */.  sql
309e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 65 6c 6c  ite3_stmt *pCell
309f0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  s = 0;       /* 
30a00 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
30a10 20 63 65 6c 6c 73 20 69 6e 20 61 20 70 61 67 65   cells in a page
30a20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
30a30 20 2a 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20   *zRecoveryDb = 
30a40 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  "";   /* Name of
30a50 20 22 72 65 63 6f 76 65 72 79 22 20 64 61 74 61   "recovery" data
30a60 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  base */.  int i;
30a70 0a 0a 20 20 69 6e 74 20 62 46 72 65 65 6c 69 73  ..  int bFreelis
30a80 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  t = 1;          
30a90 20 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d 66 72      /* 0 if --fr
30aa0 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 20 69  eelist-corrupt i
30ab0 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
30ac0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
30ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
30ae0 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
30af0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
30b00 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
30b10 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
30b20 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
30b30 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31  z);.    if( n<=1
30b40 37 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 66 72  7 && memcmp("-fr
30b50 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 22 2c  eelist-corrupt",
30b60 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   z, n)==0 ){.   
30b70 20 20 20 62 46 72 65 65 6c 69 73 74 20 3d 20 30     bFreelist = 0
30b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30b90 6e 3c 3d 31 32 20 26 26 20 6d 65 6d 63 6d 70 28  n<=12 && memcmp(
30ba0 22 2d 72 65 63 6f 76 65 72 79 2d 64 62 22 2c 20  "-recovery-db", 
30bb0 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28 6e  z, n)==0 && i<(n
30bc0 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
30bd0 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 52 65 63 6f  i++;.      zReco
30be0 76 65 72 79 44 62 20 3d 20 61 7a 41 72 67 5b 69  veryDb = azArg[i
30bf0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ];.    }.    els
30c00 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
30c10 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 65  ntf(stderr, "une
30c20 78 70 65 63 74 65 64 20 6f 70 74 69 6f 6e 3a 20  xpected option: 
30c30 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  %s\n", azArg[i])
30c40 3b 20 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ; .      raw_pri
30c50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74  ntf(stderr, "opt
30c60 69 6f 6e 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20  ions are:\n");. 
30c70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30c80 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 66  stderr, "    --f
30c90 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 5c  reelist-corrupt\
30ca0 6e 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  n");.      raw_p
30cb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
30cc0 20 20 20 2d 2d 72 65 63 6f 76 65 72 79 2d 64 62     --recovery-db
30cd0 20 44 41 54 41 42 41 53 45 5c 6e 22 29 3b 0a 20   DATABASE\n");. 
30ce0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
30cf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c     }.  }..  shel
30d00 6c 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61  lExecPrintf(pSta
30d10 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20  te->db, &rc,.   
30d20 20 2f 2a 20 41 74 74 61 63 68 20 61 6e 20 69 6e   /* Attach an in
30d30 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
30d40 20 6e 61 6d 65 64 20 27 72 65 63 6f 76 65 72 79   named 'recovery
30d50 27 2e 20 43 72 65 61 74 65 20 61 6e 20 69 6e 64  '. Create an ind
30d60 65 78 65 64 20 0a 20 20 20 20 2a 2a 20 63 61 63  exed .    ** cac
30d70 68 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  he of the sqlite
30d80 5f 64 62 70 74 72 20 76 69 72 74 75 61 6c 20 74  _dbptr virtual t
30d90 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 22 41 54  able. */.    "AT
30da0 54 41 43 48 20 25 51 20 41 53 20 72 65 63 6f 76  TACH %Q AS recov
30db0 65 72 79 3b 22 0a 20 20 20 20 22 44 52 4f 50 20  ery;".    "DROP 
30dc0 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
30dd0 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 3b 22  recovery.dbptr;"
30de0 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
30df0 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76   IF EXISTS recov
30e00 65 72 79 2e 66 72 65 65 6c 69 73 74 3b 22 0a 20  ery.freelist;". 
30e10 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49     "DROP TABLE I
30e20 46 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72  F EXISTS recover
30e30 79 2e 6d 61 70 3b 22 0a 20 20 20 20 22 44 52 4f  y.map;".    "DRO
30e40 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
30e50 53 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  S recovery.schem
30e60 61 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  a;".    "CREATE 
30e70 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 64  TABLE recovery.d
30e80 62 70 74 72 28 22 0a 20 20 20 20 22 20 20 20 20  bptr(".    "    
30e90 20 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c 20 50    pgno, child, P
30ea0 52 49 4d 41 52 59 20 4b 45 59 28 63 68 69 6c 64  RIMARY KEY(child
30eb0 2c 20 70 67 6e 6f 29 22 0a 20 20 20 20 22 29 20  , pgno)".    ") 
30ec0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a  WITHOUT ROWID;".
30ed0 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
30ee0 47 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63 6f 76  GNORE INTO recov
30ef0 65 72 79 2e 64 62 70 74 72 28 70 67 6e 6f 2c 20  ery.dbptr(pgno, 
30f00 63 68 69 6c 64 29 20 22 0a 20 20 20 20 22 20 20  child) ".    "  
30f10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
30f20 73 71 6c 69 74 65 5f 64 62 70 74 72 3b 22 0a 0a  sqlite_dbptr;"..
30f30 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e      /* Delete an
30f40 79 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  y pointer to pag
30f50 65 20 31 2e 20 54 68 69 73 20 65 6e 73 75 72 65  e 1. This ensure
30f60 73 20 74 68 61 74 20 70 61 67 65 20 31 20 69 73  s that page 1 is
30f70 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20   considered.    
30f80 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67 65 2c 20  ** a root page, 
30f90 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f  regardless of ho
30fa0 77 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 62  w corrupt the db
30fb0 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c   is. */.    "DEL
30fc0 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  ETE FROM recover
30fd0 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68  y.dbptr WHERE ch
30fe0 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f  ild = 1;"..    /
30ff0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69  * Delete all poi
31000 6e 74 65 72 73 20 74 6f 20 61 6e 79 20 70 61 67  nters to any pag
31010 65 73 20 74 68 61 74 20 68 61 76 65 20 6d 6f 72  es that have mor
31020 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74  e than one point
31030 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
31040 6d 2e 20 53 75 63 68 20 70 61 67 65 73 20 77 69  m. Such pages wi
31050 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
31060 20 72 6f 6f 74 20 70 61 67 65 73 20 77 68 65 6e   root pages when
31070 20 72 65 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   recovering.    
31080 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  ** data.  */.   
31090 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65   "DELETE FROM re
310a0 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
310b0 52 45 20 63 68 69 6c 64 20 49 4e 20 28 22 0a 20  RE child IN (". 
310c0 20 20 20 22 20 20 53 45 4c 45 43 54 20 63 68 69     "  SELECT chi
310d0 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  ld FROM recovery
310e0 2e 64 62 70 74 72 20 47 52 4f 55 50 20 42 59 20  .dbptr GROUP BY 
310f0 63 68 69 6c 64 20 48 41 56 49 4e 47 20 63 6f 75  child HAVING cou
31100 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b  nt(*)>1".    ");
31110 22 0a 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  "..    "CREATE T
31120 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 66 72  ABLE recovery.fr
31130 65 65 6c 69 73 74 28 70 67 6e 6f 20 49 4e 54 45  eelist(pgno INTE
31140 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29  GER PRIMARY KEY)
31150 3b 22 2c 20 7a 52 65 63 6f 76 65 72 79 44 62 0a  ;", zRecoveryDb.
31160 20 20 29 3b 0a 0a 20 20 69 66 28 20 62 46 72 65    );..  if( bFre
31170 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 73 68 65  elist ){.    she
31180 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d 3e 64  llExec(pState->d
31190 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 57  b, &rc,.      "W
311a0 49 54 48 20 74 72 75 6e 6b 28 70 67 6e 6f 29 20  ITH trunk(pgno) 
311b0 41 53 20 28 22 0a 20 20 20 20 20 20 22 20 20 53  AS (".      "  S
311c0 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74 33  ELECT shell_int3
311d0 32 28 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  2(".      "     
311e0 20 28 53 45 4c 45 43 54 20 64 61 74 61 20 46 52   (SELECT data FR
311f0 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
31200 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 29 2c 20   WHERE pgno=1), 
31210 38 29 20 41 53 20 78 20 22 0a 20 20 20 20 20 20  8) AS x ".      
31220 22 20 20 20 20 20 20 57 48 45 52 45 20 78 3e 30  "      WHERE x>0
31230 22 0a 20 20 20 20 20 20 22 20 20 20 20 55 4e 49  ".      "    UNI
31240 4f 4e 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c  ON".      "  SEL
31250 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28  ECT shell_int32(
31260 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 28  ".      "      (
31270 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
31280 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57   sqlite_dbpage W
31290 48 45 52 45 20 70 67 6e 6f 3d 74 72 75 6e 6b 2e  HERE pgno=trunk.
312a0 70 67 6e 6f 29 2c 20 30 29 20 41 53 20 78 20 22  pgno), 0) AS x "
312b0 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46 52  .      "      FR
312c0 4f 4d 20 74 72 75 6e 6b 20 57 48 45 52 45 20 78  OM trunk WHERE x
312d0 3e 30 22 0a 20 20 20 20 20 20 22 29 2c 22 0a 20  >0".      "),". 
312e0 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 28 64       "freelist(d
312f0 61 74 61 2c 20 6e 2c 20 66 72 65 65 70 67 6e 6f  ata, n, freepgno
31300 29 20 41 53 20 28 22 0a 20 20 20 20 20 20 22 20  ) AS (".      " 
31310 20 53 45 4c 45 43 54 20 64 61 74 61 2c 20 73 68   SELECT data, sh
31320 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c 20  ell_int32(data, 
31330 31 29 2d 31 2c 20 74 2e 70 67 6e 6f 20 22 0a 20  1)-1, t.pgno ". 
31340 20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f 4d       "      FROM
31350 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c 69 74 65   trunk t, sqlite
31360 5f 64 62 70 61 67 65 20 73 20 57 48 45 52 45 20  _dbpage s WHERE 
31370 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f 22 0a 20  s.pgno=t.pgno". 
31380 20 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20       "    UNION 
31390 41 4c 4c 22 0a 20 20 20 20 20 20 22 20 20 53 45  ALL".      "  SE
313a0 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d 31 2c 20  LECT data, n-1, 
313b0 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61  shell_int32(data
313c0 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20 20 20 22  , 2+n) ".      "
313d0 20 20 20 20 20 20 46 52 4f 4d 20 66 72 65 65 6c        FROM freel
313e0 69 73 74 20 57 48 45 52 45 20 6e 3e 3d 30 22 0a  ist WHERE n>=0".
313f0 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20        ")".      
31400 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 72 65  "REPLACE INTO re
31410 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 20  covery.freelist 
31420 53 45 4c 45 43 54 20 66 72 65 65 70 67 6e 6f 20  SELECT freepgno 
31430 46 52 4f 4d 20 66 72 65 65 6c 69 73 74 3b 22 0a  FROM freelist;".
31440 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 68      );.  }..  sh
31450 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d 3e  ellExec(pState->
31460 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 2f 2a  db, &rc, .    /*
31470 20 43 72 65 61 74 65 20 74 68 65 20 22 6d 61 70   Create the "map
31480 22 20 74 61 62 6c 65 20 74 68 61 74 20 77 69 6c  " table that wil
31490 6c 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 63  l (eventually) c
314a0 6f 6e 74 61 69 6e 20 69 6e 73 74 72 75 63 74 69  ontain instructi
314b0 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 64  ons.    ** for d
314c0 65 61 6c 69 6e 67 20 77 69 74 68 20 65 61 63 68  ealing with each
314d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 62 20   page in the db 
314e0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
314f0 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  e or more .    *
31500 2a 20 72 65 63 6f 72 64 73 2e 20 2a 2f 0a 20 20  * records. */.  
31510 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
31520 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 22 0a 20  recovery.map(". 
31530 20 20 20 20 20 22 70 67 6e 6f 20 49 4e 54 45 47       "pgno INTEG
31540 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
31550 6d 61 78 6c 65 6e 20 49 4e 54 2c 20 69 6e 74 6b  maxlen INT, intk
31560 65 79 2c 20 72 6f 6f 74 20 49 4e 54 22 0a 20 20  ey, root INT".  
31570 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a 20 50    ");"..    /* P
31580 6f 70 75 6c 61 74 65 20 74 61 62 6c 65 20 5b 6d  opulate table [m
31590 61 70 5d 2e 20 49 66 20 74 68 65 72 65 20 61 72  ap]. If there ar
315a0 65 20 63 69 72 63 75 6c 61 72 20 6c 6f 6f 70 73  e circular loops
315b0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
315c0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
315d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
315e0 61 64 64 73 20 61 6c 6c 20 70 61 67 65 73 20 69  adds all pages i
315f0 6e 20 73 75 63 68 20 61 20 6c 6f 6f 70 20 74 6f  n such a loop to
31600 20 74 68 65 20 6d 61 70 0a 20 20 20 20 2a 2a 20   the map.    ** 
31610 61 73 20 69 6e 64 69 76 69 64 75 61 6c 20 72 6f  as individual ro
31620 6f 74 20 70 61 67 65 73 2e 20 54 68 69 73 20 63  ot pages. This c
31630 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c 65 64 20  ould be handled 
31640 62 65 74 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  better.  */.    
31650 22 57 49 54 48 20 70 61 67 65 73 28 69 2c 20 6d  "WITH pages(i, m
31660 61 78 6c 65 6e 29 20 41 53 20 28 22 0a 20 20 20  axlen) AS (".   
31670 20 22 20 20 53 45 4c 45 43 54 20 70 61 67 65 5f   "  SELECT page_
31680 63 6f 75 6e 74 2c 20 28 22 0a 20 20 20 20 22 20  count, (".    " 
31690 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 66 69     SELECT max(fi
316a0 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c 69  eld+1) FROM sqli
316b0 74 65 5f 64 62 64 61 74 61 20 57 48 45 52 45 20  te_dbdata WHERE 
316c0 70 67 6e 6f 3d 70 61 67 65 5f 63 6f 75 6e 74 22  pgno=page_count"
316d0 0a 20 20 20 20 22 20 20 29 20 46 52 4f 4d 20 70  .    "  ) FROM p
316e0 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f 75 6e 74  ragma_page_count
316f0 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e  ".    "    UNION
31700 20 41 4c 4c 22 0a 20 20 20 20 22 20 20 53 45 4c   ALL".    "  SEL
31710 45 43 54 20 69 2d 31 2c 20 28 22 0a 20 20 20 20  ECT i-1, (".    
31720 22 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  "    SELECT max(
31730 66 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71  field+1) FROM sq
31740 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45 52  lite_dbdata WHER
31750 45 20 70 67 6e 6f 3d 69 2d 31 22 0a 20 20 20 20  E pgno=i-1".    
31760 22 20 20 29 20 46 52 4f 4d 20 70 61 67 65 73 20  "  ) FROM pages 
31770 57 48 45 52 45 20 69 3e 3d 32 22 0a 20 20 20 20  WHERE i>=2".    
31780 22 29 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  ")".    "INSERT 
31790 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 6d 61  INTO recovery.ma
317a0 70 28 70 67 6e 6f 2c 20 6d 61 78 6c 65 6e 2c 20  p(pgno, maxlen, 
317b0 69 6e 74 6b 65 79 2c 20 72 6f 6f 74 29 20 22 0a  intkey, root) ".
317c0 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 69 2c      "  SELECT i,
317d0 20 6d 61 78 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 28   maxlen, NULL, (
317e0 22 0a 20 20 20 20 22 20 20 20 20 57 49 54 48 20  ".    "    WITH 
317f0 70 28 6f 72 69 67 2c 20 70 67 6e 6f 2c 20 70 61  p(orig, pgno, pa
31800 72 65 6e 74 29 20 41 53 20 28 22 0a 20 20 20 20  rent) AS (".    
31810 22 20 20 20 20 20 20 53 45 4c 45 43 54 20 30 2c  "      SELECT 0,
31820 20 69 2c 20 28 53 45 4c 45 43 54 20 70 67 6e 6f   i, (SELECT pgno
31830 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
31840 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
31850 3d 69 29 22 0a 20 20 20 20 22 20 20 20 20 20 20  =i)".    "      
31860 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20    UNION ALL".   
31870 20 22 20 20 20 20 20 20 53 45 4c 45 43 54 20 69   "      SELECT i
31880 2c 20 70 2e 70 61 72 65 6e 74 2c 20 22 0a 20 20  , p.parent, ".  
31890 20 20 22 20 20 20 20 20 20 20 20 28 53 45 4c 45    "        (SELE
318a0 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63  CT pgno FROM rec
318b0 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45 52  overy.dbptr WHER
318c0 45 20 63 68 69 6c 64 3d 70 2e 70 61 72 65 6e 74  E child=p.parent
318d0 29 20 46 52 4f 4d 20 70 22 0a 20 20 20 20 22 20  ) FROM p".    " 
318e0 20 20 20 29 22 0a 20 20 20 20 22 20 20 20 20 53     )".    "    S
318f0 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
31900 70 20 57 48 45 52 45 20 28 70 61 72 65 6e 74 20  p WHERE (parent 
31910 49 53 20 4e 55 4c 4c 20 4f 52 20 70 67 6e 6f 20  IS NULL OR pgno 
31920 3d 20 6f 72 69 67 29 22 0a 20 20 20 20 22 29 20  = orig)".    ") 
31930 22 0a 20 20 20 20 22 46 52 4f 4d 20 70 61 67 65  ".    "FROM page
31940 73 20 57 48 45 52 45 20 6d 61 78 6c 65 6e 20 3e  s WHERE maxlen >
31950 20 30 20 41 4e 44 20 69 20 4e 4f 54 20 49 4e 20   0 AND i NOT IN 
31960 66 72 65 65 6c 69 73 74 3b 22 0a 20 20 20 20 22  freelist;".    "
31970 55 50 44 41 54 45 20 72 65 63 6f 76 65 72 79 2e  UPDATE recovery.
31980 6d 61 70 20 41 53 20 6f 20 53 45 54 20 69 6e 74  map AS o SET int
31990 6b 65 79 20 3d 20 28 22 0a 20 20 20 20 22 20 20  key = (".    "  
319a0 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 64 61  SELECT substr(da
319b0 74 61 2c 20 31 2c 20 31 29 3d 3d 58 27 30 44 27  ta, 1, 1)==X'0D'
319c0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
319d0 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 6f  age WHERE pgno=o
319e0 2e 70 67 6e 6f 22 0a 20 20 20 20 22 29 3b 22 0a  .pgno".    ");".
319f0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
31a00 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 31  data from page 1
31a10 20 61 6e 64 20 61 6e 79 20 6c 69 6e 6b 65 64 20   and any linked 
31a20 70 61 67 65 73 20 69 6e 74 6f 20 74 61 62 6c 65  pages into table
31a30 0a 20 20 20 20 2a 2a 20 72 65 63 6f 76 65 72 79  .    ** recovery
31a40 2e 73 63 68 65 6d 61 2e 20 57 69 74 68 20 74 68  .schema. With th
31a50 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 73  e same schema as
31a60 20 61 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   an sqlite_maste
31a70 72 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  r table.  */.   
31a80 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72   "CREATE TABLE r
31a90 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 28 74  ecovery.schema(t
31aa0 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e  ype, name, tbl_n
31ab0 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
31ac0 71 6c 29 3b 22 0a 20 20 20 20 22 49 4e 53 45 52  ql);".    "INSER
31ad0 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e  T INTO recovery.
31ae0 73 63 68 65 6d 61 20 53 45 4c 45 43 54 20 22 0a  schema SELECT ".
31af0 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45 20      "  max(CASE 
31b00 57 48 45 4e 20 66 69 65 6c 64 3d 30 20 54 48 45  WHEN field=0 THE
31b10 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c  N value ELSE NUL
31b20 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20  L END),".    "  
31b30 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69  max(CASE WHEN fi
31b40 65 6c 64 3d 31 20 54 48 45 4e 20 76 61 6c 75 65  eld=1 THEN value
31b50 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c   ELSE NULL END),
31b60 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53  ".    "  max(CAS
31b70 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 32 20 54  E WHEN field=2 T
31b80 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e  HEN value ELSE N
31b90 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22  ULL END),".    "
31ba0 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20    max(CASE WHEN 
31bb0 66 69 65 6c 64 3d 33 20 54 48 45 4e 20 76 61 6c  field=3 THEN val
31bc0 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44  ue ELSE NULL END
31bd0 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  ),".    "  max(C
31be0 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 34  ASE WHEN field=4
31bf0 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
31c00 20 4e 55 4c 4c 20 45 4e 44 29 22 0a 20 20 20 20   NULL END)".    
31c10 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64  "FROM sqlite_dbd
31c20 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 20 49  ata WHERE pgno I
31c30 4e 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45  N (".    "  SELE
31c40 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63  CT pgno FROM rec
31c50 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20  overy.map WHERE 
31c60 72 6f 6f 74 3d 31 22 0a 20 20 20 20 22 29 22 0a  root=1".    ")".
31c70 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 70 67      "GROUP BY pg
31c80 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20 20 29 3b 0a  no, cell;".  );.
31c90 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61  .  /* Open a tra
31ca0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70  nsaction, then p
31cb0 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20 6e 6f 6e  rint out all non
31cc0 2d 76 69 72 74 75 61 6c 2c 20 6e 6f 6e 2d 22 73  -virtual, non-"s
31cd0 71 6c 69 74 65 5f 25 22 20 0a 20 20 2a 2a 20 43  qlite_%" .  ** C
31ce0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
31cf0 65 6d 65 6e 74 73 20 74 68 61 74 20 65 78 74 72  ements that extr
31d00 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65  acted from the e
31d10 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 2e 20  xisting schema. 
31d20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
31d30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
31d40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
31d50 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 61 77 5f  mt = 0;.    raw_
31d60 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
31d70 75 74 2c 20 22 42 45 47 49 4e 3b 5c 6e 22 29 3b  ut, "BEGIN;\n");
31d80 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
31d90 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52  pState->out, "PR
31da0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
31db0 68 65 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a  hema = on;\n");.
31dc0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
31dd0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
31de0 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
31df0 54 20 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f 76  T sql FROM recov
31e00 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20  ery.schema ".   
31e10 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
31e20 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c  ='table' AND sql
31e30 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20 74 61   LIKE 'create ta
31e40 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74 0a 20  ble%'", &pStmt. 
31e50 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28     );.    while(
31e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31e70 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
31e80 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
31e90 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
31ea0 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54 61   char *zCreateTa
31eb0 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ble = (const cha
31ec0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
31ed0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
31ee0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
31ef0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
31f00 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
31f10 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 3b 5c   NOT EXISTS %s;\
31f20 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 26  n", .          &
31f30 7a 43 72 65 61 74 65 54 61 62 6c 65 5b 31 32 5d  zCreateTable[12]
31f40 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
31f50 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
31f60 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
31f70 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   }..  shellPrepa
31f80 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
31f90 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  rc,.      "SELEC
31fa0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f  T pgno FROM reco
31fb0 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72  very.map WHERE r
31fc0 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a  oot=?", &pPages.
31fd0 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70    );.  shellPrep
31fe0 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
31ff0 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  &rc,.      "SELE
32000 43 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20 67  CT max(field), g
32010 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c  roup_concat(shel
32020 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71 75  l_escape_crnl(qu
32030 6f 74 65 28 76 61 6c 75 65 29 29 2c 20 27 2c 20  ote(value)), ', 
32040 27 29 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20  ')".      "FROM 
32050 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48  sqlite_dbdata WH
32060 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20 41 4e 44  ERE pgno = ? AND
32070 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a 20 20 20   field != ?".   
32080 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 65 6c     "GROUP BY cel
32090 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20 20 29 3b  l", &pCells.  );
320a0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
320b0 75 67 68 20 65 61 63 68 20 72 6f 6f 74 20 70 61  ugh each root pa
320c0 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72  ge. */.  shellPr
320d0 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
320e0 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22 53  , &rc, .      "S
320f0 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69 6e 74 6b  ELECT root, intk
32100 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65 6e 29 20  ey, max(maxlen) 
32110 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61  FROM recovery.ma
32120 70 22 20 0a 20 20 20 20 20 20 22 20 57 48 45 52  p" .      " WHER
32130 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55 50 20 42  E root>1 GROUP B
32140 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65 79 20 4f  Y root, intkey O
32150 52 44 45 52 20 42 59 20 72 6f 6f 74 3d 28 22 0a  RDER BY root=(".
32160 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
32170 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 72 65  rootpage FROM re
32180 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48  covery.schema WH
32190 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c 69 74 65  ERE name='sqlite
321a0 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
321b0 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70 0a 20 20    ")", &pLoop.  
321c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
321d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
321e0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
321f0 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20 29 7b 0a  _step(pLoop) ){.
32200 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
32210 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
32220 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b 0a 20 20  nt(pLoop, 0);.  
32230 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 20 3d 20    int bIntkey = 
32240 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
32250 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b 0a 20 20  nt(pLoop, 1);.  
32260 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
32270 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
32280 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20 20 20 52  pLoop, 2);.    R
32290 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61  ecoverTable *pTa
322a0 62 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 72  b;..    pTab = r
322b0 65 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 70  ecoverNewTable(p
322c0 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f 6f  State, &rc, iRoo
322d0 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c  t, bIntkey, nCol
322e0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
322f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
32300 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
32310 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
32320 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 20  lite_sequence") 
32330 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
32340 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
32350 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
32360 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
32370 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
32380 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
32390 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 31 2c 20  _int(pPages, 1, 
323a0 69 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 73 71  iRoot);.      sq
323b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
323c0 43 65 6c 6c 73 2c 20 32 2c 20 70 54 61 62 2d 3e  Cells, 2, pTab->
323d0 69 50 6b 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  iPk);.      whil
323e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
323f0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
32400 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50 61  sqlite3_step(pPa
32410 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ges) ){.        
32420 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
32430 28 70 43 65 6c 6c 73 2c 20 31 2c 20 73 71 6c 69  (pCells, 1, sqli
32440 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
32450 50 61 67 65 73 2c 20 30 29 29 3b 0a 20 20 20 20  Pages, 0));.    
32460 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
32470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
32480 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
32490 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a  step(pCells) ){.
324a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d            int iM
324b0 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ax = sqlite3_col
324c0 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  umn_int(pCells, 
324d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  0);.          co
324e0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
324f0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
32500 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
32510 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 20 20  t(pCells, 1);.  
32520 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
32530 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
32540 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28  "INSERT INTO %s(
32550 25 73 29 20 56 41 4c 55 45 53 28 20 25 73 20 29  %s) VALUES( %s )
32560 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ;\n", .         
32570 20 20 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74       pTab->zQuot
32580 65 64 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c  ed, pTab->azlCol
32590 5b 69 4d 61 78 3e 30 3f 69 4d 61 78 3a 30 5d 2c  [iMax>0?iMax:0],
325a0 20 7a 56 61 6c 0a 20 20 20 20 20 20 20 20 20 20   zVal.          
325b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
325c0 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
325d0 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20  &rc, pCells);.  
325e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c      }.      shel
325f0 6c 52 65 73 65 74 28 26 72 63 2c 20 70 50 61 67  lReset(&rc, pPag
32600 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  es);.    }.    r
32610 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28  ecoverFreeTable(
32620 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 68 65  pTab);.  }.  she
32630 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
32640 70 4c 6f 6f 70 29 3b 0a 20 20 73 68 65 6c 6c 46  pLoop);.  shellF
32650 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50 61  inalize(&rc, pPa
32660 67 65 73 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e  ges);.  shellFin
32670 61 6c 69 7a 65 28 26 72 63 2c 20 70 43 65 6c 6c  alize(&rc, pCell
32680 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  s);..  /* The re
32690 73 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  st of the schema
326a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
326b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
326c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
326d0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c  mt = 0;.    shel
326e0 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
326f0 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20  >db, &rc, .     
32700 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 2c 20     "SELECT sql, 
32710 6e 61 6d 65 20 46 52 4f 4d 20 72 65 63 6f 76 65  name FROM recove
32720 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20  ry.schema ".    
32730 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
32740 4f 54 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20  OT LIKE 'create 
32750 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74  table%'", &pStmt
32760 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
32770 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
32780 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
32790 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
327a0 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  mt) ){.      con
327b0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
327c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
327d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
327e0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
327f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
32800 72 6e 69 63 6d 70 28 7a 53 71 6c 2c 20 22 63 72  rnicmp(zSql, "cr
32810 65 61 74 65 20 76 69 72 74 22 2c 20 31 31 29 3d  eate virt", 11)=
32820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
32830 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
32840 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
32850 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
32860 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
32870 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 69        char *zPri
32880 6e 74 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  nt = shellMPrint
32890 66 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  f(&rc, .        
328a0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
328b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
328c0 55 45 53 28 27 74 61 62 6c 65 27 2c 20 25 51 2c  UES('table', %Q,
328d0 20 25 51 2c 20 30 2c 20 25 51 29 22 2c 0a 20 20   %Q, 0, %Q)",.  
328e0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
328f0 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20 20 20 20 20  Name, zSql.     
32900 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 61     );.        ra
32910 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
32920 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  >out, "%s;\n", z
32930 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  Print);.        
32940 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
32950 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  int);.      }els
32960 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
32970 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
32980 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c  t, "%s;\n", zSql
32990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
329a0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
329b0 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
329c0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
329d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
329e0 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
329f0 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  e->out, "PRAGMA 
32a00 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
32a10 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a 20 20 20 20  = off;\n");.    
32a20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
32a30 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b  e->out, "COMMIT;
32a40 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  \n");.  }.  sqli
32a50 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d  te3_exec(pState-
32a60 3e 64 62 2c 20 22 44 45 54 41 43 48 20 72 65 63  >db, "DETACH rec
32a70 6f 76 65 72 79 22 2c 20 30 2c 20 30 2c 20 30 29  overy", 0, 0, 0)
32a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
32a90 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  .../*.** If an i
32aa0 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
32ab0 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
32ac0 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
32ad0 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
32ae0 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
32af0 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
32b00 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
32b10 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
32b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
32b30 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63  o_meta_command(c
32b40 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c  har *zLine, Shel
32b50 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
32b60 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e  t h = 1;.  int n
32b70 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Arg = 0;.  int n
32b80 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  , c;.  int rc = 
32b90 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67  0;.  char *azArg
32ba0 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53  [50];..#ifndef S
32bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
32bc0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d  ALTABLE.  if( p-
32bd0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
32be0 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e  ){.    expertFin
32bf0 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20  ish(p, 1, 0);.  
32c00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50  }.#endif..  /* P
32c10 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c  arse the input l
32c20 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e  ine into tokens.
32c30 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  .  */.  while( z
32c40 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c  Line[h] && nArg<
32c50 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29  ArraySize(azArg)
32c60 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   ){.    while( I
32c70 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29  sSpace(zLine[h])
32c80 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ h++; }.    i
32c90 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29  f( zLine[h]==0 )
32ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
32cb0 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c  zLine[h]=='\'' |
32cc0 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20  | zLine[h]=='"' 
32cd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c  ){.      int del
32ce0 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b  im = zLine[h++];
32cf0 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
32d00 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
32d10 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
32d20 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65  Line[h] && zLine
32d30 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20  [h]!=delim ){.  
32d40 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
32d50 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69  h]=='\\' && deli
32d60 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b  m=='"' && zLine[
32d70 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20  h+1]!=0 ) h++;. 
32d80 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20         h++;.    
32d90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c    }.      if( zL
32da0 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b  ine[h]==delim ){
32db0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68  .        zLine[h
32dc0 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ++] = 0;.      }
32dd0 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d  .      if( delim
32de0 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f  =='"' ) resolve_
32df0 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
32e00 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
32e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41  }else{.      azA
32e20 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
32e30 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
32e40 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
32e50 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b   !IsSpace(zLine[
32e60 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20  h]) ){ h++; }.  
32e70 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
32e80 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20   ) zLine[h++] = 
32e90 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65  0;.      resolve
32ea0 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
32eb0 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
32ec0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
32ed0 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c  cess the input l
32ee0 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
32ef0 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nArg==0 ) return
32f00 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73   0; /* no tokens
32f10 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
32f20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  n = strlen30(azA
32f30 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a  rg[0]);.  c = az
32f40 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65  Arg[0][0];.  cle
32f50 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a  arTempFile(p);..
32f60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32f70 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
32f80 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  N.  if( c=='a' &
32f90 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
32fa0 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d  0], "auth", n)==
32fb0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
32fc0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
32fd0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32fe0 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f   "Usage: .auth O
32ff0 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20  N|OFF\n");.     
33000 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
33010 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33020 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
33030 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
33040 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
33050 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
33060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
33070 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
33080 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c  ->db, shellAuth,
33090 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
330a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
330b0 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
330c0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  db, 0, 0);.    }
330d0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
330e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
330f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
33100 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
33110 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
33120 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61  LIB).  if( c=='a
33130 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
33140 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22  rg[0], "archive"
33150 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
33160 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
33170 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d    rc = arDotComm
33180 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67 2c  and(p, 0, azArg,
33190 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
331a0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63  #endif..  if( (c
331b0 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
331c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
331d0 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d  ], "backup", n)=
331e0 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73  =0).   || (c=='s
331f0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
33200 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33210 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  save", n)==0).  
33220 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
33230 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30  r *zDestFile = 0
33240 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
33250 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73   *zDb = 0;.    s
33260 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
33270 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
33280 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
33290 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 62  int j;.    int b
332a0 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  Async = 0;.    c
332b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
332c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  = 0;.    for(j=1
332d0 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
332e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
332f0 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
33300 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
33310 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '-' ){.        i
33320 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  f( z[1]=='-' ) z
33330 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
33340 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65  strcmp(z, "-appe
33350 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
33360 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61 70 6e       zVfs = "apn
33370 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20 20 7d  dvfs";.        }
33380 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
33390 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 73 79   strcmp(z, "-asy
333a0 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nc")==0 ){.     
333b0 20 20 20 20 20 62 41 73 79 6e 63 20 3d 20 31 3b       bAsync = 1;
333c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
333d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
333e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
333f0 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
33400 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61  option: %s\n", a
33410 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  zArg[j]);.      
33420 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
33430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33440 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c  lse if( zDestFil
33450 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33460 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
33470 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
33480 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a  e if( zDb==0 ){.
33490 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44          zDb = zD
334a0 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20  estFile;.       
334b0 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
334c0 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
334d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
334e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
334f0 55 73 61 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f  Usage: .backup ?
33500 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49  DB? ?OPTIONS? FI
33510 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
33520 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
33530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33540 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
33550 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
33560 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69  intf(stderr, "mi
33570 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61  ssing FILENAME a
33580 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b  rgument on .back
33590 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  up\n");.      re
335a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
335b0 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a    if( zDb==0 ) z
335c0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
335d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
335e0 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
335f0 20 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20 20   &pDest, .      
33600 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
33610 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
33620 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
33630 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20  EATE, zVfs);.   
33640 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
33660 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33670 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
33680 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
33690 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20  DestFile);.     
336a0 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29   close_db(pDest)
336b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
336c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
336d0 62 41 73 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  bAsync ){.      
336e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 65  sqlite3_exec(pDe
336f0 73 74 2c 20 22 50 52 41 47 4d 41 20 73 79 6e 63  st, "PRAGMA sync
33700 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20 50 52 41  hronous=OFF; PRA
33710 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
33720 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20 20 20 20  =OFF;",.        
33730 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
33740 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f   0);.    }.    o
33750 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
33760 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
33770 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
33780 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
33790 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ->db, zDb);.    
337a0 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
337b0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
337c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
337d0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
337e0 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
337f0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64  );.      close_d
33800 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  b(pDest);.      
33810 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
33820 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
33830 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
33840 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
33850 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
33860 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
33870 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
33880 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
33890 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
338a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
338b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
338c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
338d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
338e0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
338f0 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
33900 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
33910 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65      close_db(pDe
33920 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
33930 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
33940 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
33950 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20  Arg[0], "bail", 
33960 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
33970 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
33980 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20    bail_on_error 
33990 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
339a0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
339b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
339c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
339d0 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f  sage: .bail on|o
339e0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
339f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
33a00 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
33a10 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
33a20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33a30 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29  binary", n)==0 )
33a40 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
33a50 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  2 ){.      if( b
33a60 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
33a70 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  g[1]) ){.       
33a80 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70   setBinaryMode(p
33a90 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
33aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33ab0 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f  setTextMode(p->o
33ac0 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ut, 1);.      }.
33ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33ae0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33af0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e  rr, "Usage: .bin
33b00 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ary on|off\n");.
33b10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
33b20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
33b30 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72  f( c=='c' && str
33b40 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64  cmp(azArg[0],"cd
33b50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
33b60 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20   nArg==2 ){.#if 
33b70 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
33b80 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
33b90 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74 20  ).      wchar_t 
33ba0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
33bb0 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
33bc0 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  de(azArg[1]);.  
33bd0 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75 72      rc = !SetCur
33be0 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 7a  rentDirectoryW(z
33bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33c00 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a  _free(z);.#else.
33c10 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69 72        rc = chdir
33c20 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64  (azArg[1]);.#end
33c30 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
33c40 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
33c50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33c60 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f  Cannot change to
33c70 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73 5c   directory \"%s\
33c80 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
33c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
33ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33cb0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
33cc0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
33cd0 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54 4f  age: .cd DIRECTO
33ce0 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RY\n");.      rc
33cf0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
33d00 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e  lse..  /* The un
33d10 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72 65  documented ".bre
33d20 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64  akpoint" command
33d30 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20 74   causes a call t
33d40 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a  o the no-op.  **
33d50 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20 74   routine named t
33d60 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
33d70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d  ..  */.  if( c==
33d80 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
33d90 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
33da0 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e   "breakpoint", n
33db0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74  )==0 ){.    test
33dc0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
33dd0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
33de0 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='c' && n>=3 && 
33df0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33e00 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d  , "changes", n)=
33e10 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
33e20 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
33e30 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c  etOrClearFlag(p,
33e40 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e   SHFLG_CountChan
33e50 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  ges, azArg[1]);.
33e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e70 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33e80 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 61  rr, "Usage: .cha
33e90 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nges on|off\n");
33ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
33eb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
33ec0 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75 74  /* Cancel output
33ed0 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69 66   redirection, if
33ee0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
33ef0 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63 61   set (by .testca
33f00 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65  se).  ** Then re
33f10 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
33f20 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d 6f  f the testcase-o
33f30 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 20  ut.txt file and 
33f40 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 0a  compare against.
33f50 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20    ** azArg[1].  
33f60 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
33f70 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72 74  ferences, report
33f80 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65 78   an error and ex
33f90 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  it..  */.  if( c
33fa0 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
33fb0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
33fc0 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d  ], "check", n)==
33fd0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
33fe0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74  Res = 0;.    out
33ff0 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
34000 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
34010 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34020 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
34030 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41  : .check GLOB-PA
34040 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  TTERN\n");.     
34050 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
34060 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20 72  se if( (zRes = r
34070 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61 73  eadFile("testcas
34080 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29 3d  e-out.txt", 0))=
34090 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
340a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
340b0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65  Error: cannot re
340c0 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74  ad 'testcase-out
340d0 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20  .txt'\n");.     
340e0 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
340f0 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65 5f  se if( testcase_
34100 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52  glob(azArg[1],zR
34110 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  es)==0 ){.      
34120 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34130 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
34140 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d 25       "testcase-%
34150 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65 63  s FAILED\n Expec
34160 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20  ted: [%s]\n     
34170 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20   Got: [%s]\n",. 
34180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34190 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61 7a  p->zTestcase, az
341a0 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20  Arg[1], zRes);. 
341b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
341c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
341d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
341e0 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 6f  , "testcase-%s o
341f0 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61  k\n", p->zTestca
34200 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  se);.      p->nC
34210 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  heck++;.    }.  
34220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
34230 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Res);.  }else.. 
34240 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
34250 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
34260 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20   "clone", n)==0 
34270 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
34280 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54  =2 ){.      tryT
34290 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b  oClone(p, azArg[
342a0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
342b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
342c0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
342d0 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45   .clone FILENAME
342e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
342f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
34300 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
34310 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  && n>1 && strncm
34320 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74  p(azArg[0], "dat
34330 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29  abases", n)==0 )
34340 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
34350 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
34360 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
34370 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
34380 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
34390 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
343a0 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
343b0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
343c0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
343d0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
343e0 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  List;.    sqlite
343f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34400 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  f(data.colSepara
34410 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70  tor),data.colSep
34420 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20  arator,": ");.  
34430 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a    data.cnt = 0;.
34440 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
34450 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
34460 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20  name, file FROM 
34470 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f  pragma_database_
34480 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20  list",.         
34490 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
344a0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
344b0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
344c0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
344d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
344e0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
344f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
34500 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
34510 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
34520 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
34530 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
34540 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
34550 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62  mp(azArg[0], "db
34560 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29  config", n)==0 )
34570 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
34580 73 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e 66  st struct DbConf
34590 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20 20 20  igChoices {.    
345a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
345b0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ame;.      int o
345c0 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f 6e 66  p;.    } aDbConf
345d0 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ig[] = {.       
345e0 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22   { "enable_fkey"
345f0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
34600 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
34610 45 59 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  EY            },
34620 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
34630 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20 20 53  le_trigger",   S
34640 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
34650 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20 20  NABLE_TRIGGER   
34660 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
34670 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a   { "fts3_tokeniz
34680 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  er",   SQLITE_DB
34690 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54  CONFIG_ENABLE_FT
346a0 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c  S3_TOKENIZER  },
346b0 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f 61 64  .        { "load
346c0 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 53  _extension",   S
346d0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
346e0 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
346f0 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20 20 20  SION  },.       
34700 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63   { "no_ckpt_on_c
34710 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f 44 42  lose", SQLITE_DB
34720 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f  CONFIG_NO_CKPT_O
34730 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 7d 2c  N_CLOSE       },
34740 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
34750 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20 20 53  le_qpsg",      S
34760 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
34770 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20 20 20  NABLE_QPSG      
34780 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
34790 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71 70 22   { "trigger_eqp"
347a0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
347b0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
347c0 51 50 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  QP            },
347d0 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65 73 65  .        { "rese
347e0 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20 20 53  t_database",   S
347f0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52  QLITE_DBCONFIG_R
34800 45 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20  ESET_DATABASE   
34810 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
34820 20 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20   { "defensive", 
34830 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
34840 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
34850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
34860 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
34870 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f  ii, v;.    open_
34880 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f  db(p, 0);.    fo
34890 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79  r(ii=0; ii<Array
348a0 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b  Size(aDbConfig);
348b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
348c0 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63  ( nArg>1 && strc
348d0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62  mp(azArg[1], aDb
348e0 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
348f0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
34900 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
34910 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
34920 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
34930 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
34940 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e  [ii].op, boolean
34950 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c  Value(azArg[2]),
34960 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
34970 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
34980 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43  nfig(p->db, aDbC
34990 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31  onfig[ii].op, -1
349a0 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66  , &v);.      utf
349b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
349c0 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44   "%18s %s\n", aD
349d0 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
349e0 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  e, v ? "on" : "o
349f0 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff");.      if( 
34a00 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a  nArg>1 ) break;.
34a10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
34a20 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61  rg>1 && ii==Arra
34a30 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
34a40 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
34a50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34a60 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62  rror: unknown db
34a70 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22  config \"%s\"\n"
34a80 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
34a90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34aa0 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22  tderr, "Enter \"
34ab0 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68  .dbconfig\" with
34ac0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
34ad0 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20  r a list\n");.  
34ae0 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a    }   .  }else..
34af0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
34b00 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
34b10 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
34b20 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
34b30 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
34b40 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
34b50 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
34b60 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72  lse..  if( c=='r
34b70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
34b80 72 67 5b 30 5d 2c 20 22 72 65 63 6f 76 65 72 22  rg[0], "recover"
34b90 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
34ba0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
34bb0 20 20 72 63 20 3d 20 72 65 63 6f 76 65 72 44 61    rc = recoverDa
34bc0 74 61 62 61 73 65 43 6d 64 28 70 2c 20 6e 41 72  tabaseCmd(p, nAr
34bd0 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
34be0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
34bf0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
34c00 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
34c10 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
34c20 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
34c30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
34c40 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
34c50 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
34c60 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61  ader;.    int sa
34c70 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20  vedShellFlags = 
34c80 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20  p->shellFlgs;.  
34c90 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
34ca0 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
34cb0 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65  veRowid|SHFLG_Ne
34cc0 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68  wlines|SHFLG_Ech
34cd0 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  o);.    for(i=1;
34ce0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
34cf0 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
34d00 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
34d10 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34d20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
34d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
34d40 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
34d50 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
34d60 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
34d70 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
34d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
34d90 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
34da0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34db0 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
34dc0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
34dd0 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
34de0 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e00 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
34e10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
34e20 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
34e30 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34e40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
34e50 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
34e60 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
34e70 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
34e80 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
34e90 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
34ea0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
34eb0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
34ec0 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
34ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
34ee0 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
34ef0 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
34f00 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
34f10 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
34f20 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34f30 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
34f40 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
34f50 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
34f60 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
34f70 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
34f80 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34f90 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
34fa0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
34fb0 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
34fc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
34fd0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
34fe0 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
34ff0 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
35000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35010 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
35020 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
35030 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
35040 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
35050 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35060 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
35070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
35080 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
35090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
350a0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
350b0 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c  ..    /* When pl
350c0 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75  aying back a "du
350d0 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  mp", the content
350e0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
350f0 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   an order.    **
35100 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d   which causes im
35110 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
35120 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
35130 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a  to be violated..
35140 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c      ** So disabl
35150 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f  e foreign-key co
35160 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65  nstraint enforce
35170 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20  ment to prevent 
35180 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20  problems. */.   
35190 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
351a0 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  ut, "PRAGMA fore
351b0 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22  ign_keys=OFF;\n"
351c0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
351d0 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e  f(p->out, "BEGIN
351e0 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22   TRANSACTION;\n"
351f0 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62  );.    p->writab
35200 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  leSchema = 0;.  
35210 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
35220 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20  = 0;.    /* Set 
35230 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
35240 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  ON since doing s
35250 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20  o forces SQLite 
35260 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
35270 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20    ** as much of 
35280 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69 74  the schema as it
35290 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65   can even if the
352a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
352b0 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63  able is.    ** c
352c0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73  orrupt. */.    s
352d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
352e0 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75  b, "SAVEPOINT du
352f0 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61  mp; PRAGMA writa
35300 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20  ble_schema=ON", 
35310 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0, 0, 0);.    p-
35320 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69  >nErr = 0;.    i
35330 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20  f( zLike==0 ){. 
35340 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
35350 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
35360 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
35370 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
35380 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
35390 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  er ".          "
353a0 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
353b0 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  LL AND type=='ta
353c0 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27  ble' AND name!='
353d0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
353e0 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
353f0 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
35400 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
35410 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
35420 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
35430 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
35440 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  er ".          "
35450 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
35460 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
35470 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
35480 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
35490 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
354a0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
354b0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
354c0 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  er ".          "
354d0 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
354e0 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  LL AND type IN (
354f0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
35500 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20  ','view')", 0.  
35510 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d          );.    }
35520 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
35530 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53   *zSql;.      zS
35540 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
35550 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
35560 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
35570 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
35580 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
35590 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
355a0 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41  l_name LIKE %Q A
355b0 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
355c0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41  ".          "  A
355d0 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
355e0 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
355f0 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
35600 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20  query(p,zSql);. 
35610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
35620 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
35630 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
35640 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
35650 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
35660 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
35670 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
35680 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
35690 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
356a0 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
356b0 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
356c0 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
356d0 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20  "  AND tbl_name 
356e0 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29  LIKE %Q", zLike)
356f0 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c  ;.      run_tabl
35700 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20  e_dump_query(p, 
35710 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zSql, 0);.      
35720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
35730 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
35740 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68  ( p->writableSch
35750 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ema ){.      raw
35760 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
35770 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
35780 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29  _schema=OFF;\n")
35790 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61  ;.      p->writa
357a0 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
357b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
357c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
357d0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
357e0 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30  hema=OFF;", 0, 0
357f0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
35800 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
35810 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20 30  ELEASE dump;", 0
35820 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 61 77  , 0, 0);.    raw
35830 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
35840 70 2d 3e 6e 45 72 72 3f 22 52 4f 4c 4c 42 41 43  p->nErr?"ROLLBAC
35850 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72  K; -- due to err
35860 6f 72 73 5c 6e 22 3a 22 43 4f 4d 4d 49 54 3b 5c  ors\n":"COMMIT;\
35870 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  n");.    p->show
35880 48 65 61 64 65 72 20 3d 20 73 61 76 65 64 53 68  Header = savedSh
35890 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 70 2d  owHeader;.    p-
358a0 3e 73 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61 76  >shellFlgs = sav
358b0 65 64 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20 20  edShellFlags;.  
358c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
358d0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
358e0 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c  zArg[0], "echo",
358f0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
35900 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
35910 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61     setOrClearFla
35920 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c  g(p, SHFLG_Echo,
35930 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
35940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
35950 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35960 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e  "Usage: .echo on
35970 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
35980 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
35990 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
359a0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
359b0 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20  zArg[0], "eqp", 
359c0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
359d0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
359e0 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74    p->autoEQPtest
359f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
35a00 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20  p->autoEQPtrace 
35a10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35a20 2d 3e 64 62 20 29 20 73 71 6c 69 74 65 33 5f 65  ->db ) sqlite3_e
35a30 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
35a40 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d 4f 46  MA vdbe_trace=OF
35a50 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
35a60 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
35a70 50 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  Ptrace = 0;.    
35a80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
35a90 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
35aa0 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
35ab0 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
35ac0 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
35ad0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
35ae0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
35af0 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
35b00 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
35b10 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
35b20 67 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  gger;.#ifdef SQL
35b30 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
35b40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
35b50 28 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22  (azArg[1],"test"
35b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
35b70 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54  p->autoEQP = AUT
35b80 4f 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20  OEQP_on;.       
35b90 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20   p->autoEQPtest 
35ba0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
35bb0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
35bc0 67 5b 31 5d 2c 22 74 72 61 63 65 22 29 3d 3d 30  g[1],"trace")==0
35bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
35be0 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50  utoEQP = AUTOEQP
35bf0 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _full;.        p
35c00 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d  ->autoEQPtrace =
35c10 20 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   1;.        open
35c20 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  _db(p, 0);.     
35c30 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
35c40 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
35c50 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
35c60 6d 61 73 74 65 72 20 4c 49 4d 49 54 20 31 22 2c  master LIMIT 1",
35c70 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
35c80 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
35c90 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 76  p->db, "PRAGMA v
35ca0 64 62 65 5f 74 72 61 63 65 3d 4f 4e 3b 22 2c 20  dbe_trace=ON;", 
35cb0 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
35cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35cd0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
35ce0 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61   = (u8)booleanVa
35cf0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
35d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35d10 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
35d20 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
35d30 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74  e: .eqp off|on|t
35d40 72 61 63 65 7c 74 72 69 67 67 65 72 7c 66 75 6c  race|trigger|ful
35d50 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
35d60 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
35d70 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
35d80 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35d90 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29  g[0], "exit", n)
35da0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
35db0 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28  Arg>1 && (rc = (
35dc0 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
35dd0 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29  (azArg[1]))!=0 )
35de0 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72   exit(rc);.    r
35df0 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
35e00 20 20 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61    /* The ".expla
35e10 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  in" command is a
35e20 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49  utomatic now.  I
35e30 74 20 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69  t is largely poi
35e40 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a  ntless.  It.  **
35e50 20 72 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79   retained purely
35e60 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   for backwards c
35e70 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a  ompatibility */.
35e80 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
35e90 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
35ea0 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d  , "explain", n)=
35eb0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61  =0 ){.    int va
35ec0 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e  l = 1;.    if( n
35ed0 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
35ee0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
35ef0 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29  [1],"auto")==0 )
35f00 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20  {.        val = 
35f10 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  99;.      }else{
35f20 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20  .        val =  
35f30 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
35f40 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
35f50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61      }.    if( va
35f60 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21  l==1 && p->mode!
35f70 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
35f80 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c  .      p->normal
35f90 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
35fa0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
35fb0 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
35fc0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
35fd0 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  in = 0;.    }els
35fe0 65 20 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a  e if( val==0 ){.
35ff0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
36000 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
36010 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e  ) p->mode = p->n
36020 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20  ormalMode;.     
36030 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
36040 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
36050 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20  f( val==99 ){.  
36060 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
36070 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
36080 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
36090 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
360a0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
360b0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
360c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
360d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
360e0 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  LE.  if( c=='e' 
360f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
36100 5b 30 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e  [0], "expert", n
36110 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
36120 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65  _db(p, 0);.    e
36130 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28  xpertDotCommand(
36140 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  p, azArg, nArg);
36150 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
36160 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26  .  if( c=='f' &&
36170 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36180 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c  ], "fullschema",
36190 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
361a0 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
361b0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
361c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f   = 0;.    int do
361d0 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d  Stats = 0;.    m
361e0 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
361f0 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
36200 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
36210 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
36220 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
36230 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
36240 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
36250 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  && optionMatch(a
36260 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74  zArg[1], "indent
36270 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  ") ){.      data
36280 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
36290 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79  de = MODE_Pretty
362a0 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31  ;.      nArg = 1
362b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
362c0 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20  nArg!=1 ){.     
362d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
362e0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c  rr, "Usage: .ful
362f0 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
36300 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t?\n");.      rc
36310 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
36320 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36330 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
36340 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
36350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
36360 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
36370 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
36380 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45  M".       "  (SE
36390 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
363a0 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
363b0 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
363c0 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
363d0 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f         "     FRO
363e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
363f0 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
36400 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
36410 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
36420 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52  , name, rowid FR
36430 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
36440 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
36450 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
36460 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
36470 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
36480 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
36490 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52   ".       "ORDER
364a0 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
364b0 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
364c0 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
364d0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
364e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
364f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
36500 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63  *pStmt;.      rc
36510 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
36520 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
36530 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
36540 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
36550 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
36560 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
36570 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
36580 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
36590 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
365a0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
365b0 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73  );.      doStats
365c0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
365d0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
365e0 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OW;.      sqlite
365f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
36600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
36610 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20   doStats==0 ){. 
36620 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36630 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53  p->out, "/* No S
36640 54 41 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c  TAT tables avail
36650 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20  able */\n");.   
36660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
36670 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
36680 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
36690 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
366a0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
366b0 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
366c0 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  'ANALYZE sqlite_
366d0 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20  master'",.      
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
366f0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
36700 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
36710 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
36720 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  .mode = MODE_Ins
36730 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  ert;.      data.
36740 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
36750 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20  lite_stat1";.   
36760 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64     shell_exec(&d
36770 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ata, "SELECT * F
36780 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ROM sqlite_stat1
36790 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ", &zErrMsg);.  
367a0 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61      data.zDestTa
367b0 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74  ble = "sqlite_st
367c0 61 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c  at3";.      shel
367d0 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53  l_exec(&data, "S
367e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
367f0 69 74 65 5f 73 74 61 74 33 22 2c 20 26 7a 45 72  ite_stat3", &zEr
36800 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
36810 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
36820 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20  sqlite_stat4";. 
36830 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
36840 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a  &data, "SELECT *
36850 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
36860 74 34 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  t4", &zErrMsg);.
36870 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36880 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
36890 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
368a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  \n");.    }.  }e
368b0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68  lse..  if( c=='h
368c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
368d0 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22  rg[0], "headers"
368e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
368f0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
36900 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
36910 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
36920 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
36930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
36940 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
36950 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73  "Usage: .headers
36960 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
36970 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
36980 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
36990 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
369a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c  p(azArg[0], "hel
369b0 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
369c0 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
369d0 20 20 20 20 20 20 6e 20 3d 20 73 68 6f 77 48 65        n = showHe
369e0 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  lp(p->out, azArg
369f0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
36a00 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
36a10 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36a20 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20 6d 61 74  ut, "Nothing mat
36a30 63 68 65 73 20 27 25 73 27 5c 6e 22 2c 20 61 7a  ches '%s'\n", az
36a40 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
36a50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36a60 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75    showHelp(p->ou
36a70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 0);.    }.  }
36a80 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
36a90 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
36aa0 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22  Arg[0], "import"
36ab0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
36ac0 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20  har *zTable;    
36ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36ae0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
36af0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
36b00 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
36b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
36b30 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72  extra content fr
36b40 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  om */.    sqlite
36b50 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
36b60 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65  NULL; /* A state
36b70 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
36b80 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
36b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36ba0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
36bb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
36bc0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
36bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36be0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
36bf0 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
36c00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
36c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36c20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
36c30 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
36c40 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20  needCommit;     
36c50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
36c60 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  to COMMIT or ROL
36c70 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a  LBACK at end */.
36c80 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20      int nSep;   
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ca0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36cb0 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61  es in p->colSepa
36cc0 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63  rator[] */.    c
36cd0 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
36ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
36cf0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
36d00 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20  /.    ImportCtx 
36d10 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20  sCtx;           
36d20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74    /* Reader cont
36d30 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ext */.    char 
36d40 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a  *(SQLITE_CDECL *
36d50 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78  xRead)(ImportCtx
36d60 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72  *); /* Func to r
36d70 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f  ead one value */
36d80 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45  .    int (SQLITE
36d90 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29  _CDECL *xCloser)
36da0 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a  (FILE*);      /*
36db0 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66   Func to close f
36dc0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ile */..    if( 
36dd0 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20  nArg!=3 ){.     
36de0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36df0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70  rr, "Usage: .imp
36e00 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e  ort FILE TABLE\n
36e10 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  ");.      goto m
36e20 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
36e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
36e40 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
36e50 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
36e60 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74  [2];.    seenInt
36e70 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20  errupt = 0;.    
36e80 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c  memset(&sCtx, 0,
36e90 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a   sizeof(sCtx));.
36ea0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
36eb0 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
36ec0 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70  rlen30(p->colSep
36ed0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
36ee0 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
36ef0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36f00 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
36f10 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f        "Error: no
36f20 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65  n-null column se
36f30 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
36f40 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
36f50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
36f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
36f70 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  Sep>1 ){.      r
36f80 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36f90 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d  , "Error: multi-
36fa0 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e  character column
36fb0 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20   separators not 
36fc0 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20  allowed".       
36fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36fe0 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
36ff0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
37000 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20  .    }.    nSep 
37010 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f  = strlen30(p->ro
37020 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
37030 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
37040 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37050 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
37060 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65   non-null row se
37070 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
37080 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
37090 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
370a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
370b0 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64  Sep==2 && p->mod
370c0 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73  e==MODE_Csv && s
370d0 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61  trcmp(p->rowSepa
370e0 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29  rator, SEP_CrLf)
370f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
37100 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43  When importing C
37110 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68  SV (only), if th
37120 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  e row separator 
37130 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
37140 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f      ** default o
37150 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61  utput row separa
37160 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74  tor, change it t
37170 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e  o the default in
37180 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  put.      ** row
37190 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69   separator.  Thi
371a0 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20  s avoids having 
371b0 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66  to maintain diff
371c0 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20  erent input.    
371d0 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20    ** and output 
371e0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20  row separators. 
371f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
37200 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37210 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
37220 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
37230 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
37240 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
37250 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  n30(p->rowSepara
37260 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
37270 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
37280 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
37290 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
372a0 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72  ulti-character r
372b0 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f  ow separators no
372c0 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20  t allowed".     
372d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372e0 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22   " for import\n"
372f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
37300 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
37310 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  x.zFile = zFile;
37320 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20  .    sCtx.nLine 
37330 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74  = 1;.    if( sCt
37340 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  x.zFile[0]=='|' 
37350 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
37360 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
37370 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37380 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70  err, "Error: pip
37390 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
373a0 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c  rted in this OS\
373b0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
373c0 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  n 1;.#else.     
373d0 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e   sCtx.in = popen
373e0 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22  (sCtx.zFile+1, "
373f0 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e  r");.      sCtx.
37400 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22  zFile = "<pipe>"
37410 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20  ;.      xCloser 
37420 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66  = pclose;.#endif
37430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37440 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65    sCtx.in = fope
37450 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72  n(sCtx.zFile, "r
37460 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b");.      xClos
37470 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20  er = fclose;.   
37480 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f   }.    if( p->mo
37490 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29  de==MODE_Ascii )
374a0 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20  {.      xRead = 
374b0 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66  ascii_read_one_f
374c0 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ield;.    }else{
374d0 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 63  .      xRead = c
374e0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
374f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
37500 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20   sCtx.in==0 ){. 
37510 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
37520 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
37530 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
37540 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
37550 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
37560 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63      }.    sCtx.c
37570 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53  ColSep = p->colS
37580 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
37590 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20   sCtx.cRowSep = 
375a0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  p->rowSeparator[
375b0 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0];.    zSql = s
375c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
375d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73  SELECT * FROM %s
375e0 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
375f0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
37600 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
37610 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65  x.in);.      she
37620 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
37630 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  ();.    }.    nB
37640 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
37650 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
37660 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
37670 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
37680 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
37690 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
376a0 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b  _char(&sCtx, 0);
376b0 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
376c0 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63   sCtx.z is alloc
376d0 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ated */.    if( 
376e0 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  rc && sqlite3_st
376f0 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74  rglob("no such t
37700 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65  able: *", sqlite
37710 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
37720 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
37730 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c  r *zCreate = sql
37740 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52  ite3_mprintf("CR
37750 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20  EATE TABLE %s", 
37760 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63  zTable);.      c
37770 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
37780 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65        while( xRe
37790 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20  ad(&sCtx) ){.   
377a0 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
377b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
377c0 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54  %z%c\n  \"%w\" T
377d0 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63  EXT", zCreate, c
377e0 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20  Sep, sCtx.z);.  
377f0 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
37800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
37810 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63  tx.cTerm!=sCtx.c
37820 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a  ColSep ) break;.
37830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37840 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20  ( cSep=='(' ){.