/ Hex Artifact Content
Login

Artifact 2316b9ee7a43e6f127e5abe8d74d69b92f6bbae1be38826ffb58384aab832013:


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: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
8020: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 65  r testing and se
8030: 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a  tting shellFlgs.
8040: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  */.#define Shell
8050: 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20 20  HasFlag(P,X)    
8060: 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73  (((P)->shellFlgs
8070: 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65 66   & (X))!=0).#def
8080: 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61 67  ine ShellSetFlag
8090: 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e 73  (P,X)    ((P)->s
80a0: 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23  hellFlgs|=(X)).#
80b0: 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61  define ShellClea
80c0: 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50 29  rFlag(P,X)  ((P)
80d0: 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28  ->shellFlgs&=(~(
80e0: 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  X)))../*.** Thes
80f0: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
8100: 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66  d modes..*/.#def
8110: 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20  ine MODE_Line   
8120: 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75    0  /* One colu
8130: 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c  mn per line.  Bl
8140: 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e  ank line between
8150: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66   records */.#def
8160: 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20  ine MODE_Column 
8170: 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    1  /* One reco
8180: 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e  rd per line in n
8190: 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  eat columns */.#
81a0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74  define MODE_List
81b0: 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72       2  /* One r
81c0: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77  ecord per line w
81d0: 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72 20  ith a separator 
81e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
81f0: 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53  Semi     3  /* S
8200: 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74  ame as MODE_List
8210: 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20   but append ";" 
8220: 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a  to each line */.
8230: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d  #define MODE_Htm
8240: 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65  l     4  /* Gene
8250: 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61  rate an XHTML ta
8260: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ble */.#define M
8270: 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20  ODE_Insert   5  
8280: 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20  /* Generate SQL 
8290: 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65  "insert" stateme
82a0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
82b0: 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20 20  ODE_Quote    6  
82c0: 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73 20  /* Quote values 
82d0: 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64  as for SQL */.#d
82e0: 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20  efine MODE_Tcl  
82f0: 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72 61      7  /* Genera
8300: 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c  te ANSI-C or TCL
8310: 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73   quoted elements
8320: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8330: 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a 20  _Csv      8  /* 
8340: 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20 6e  Quote strings, n
8350: 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69 6e  umbers are plain
8360: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8370: 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20  _Explain  9  /* 
8380: 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  Like MODE_Column
8390: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72 75  , but do not tru
83a0: 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23 64  ncate data */.#d
83b0: 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69  efine MODE_Ascii
83c0: 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41 53     10  /* Use AS
83d0: 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65 63  CII unit and rec
83e0: 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73 20 28  ord separators (
83f0: 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64  0x1F/0x1E) */.#d
8400: 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74  efine MODE_Prett
8410: 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74 79  y  11  /* Pretty
8420: 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20 2a  -print schemas *
8430: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45  /.#define MODE_E
8440: 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20 43 6f  QP     12  /* Co
8450: 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e 20 51  nverts EXPLAIN Q
8460: 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75 74  UERY PLAN output
8470: 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20 2a 2f   into a graph */
8480: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
8490: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
84a0: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
84b0: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
84c0: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
84d0: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
84e0: 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a  rt",.  "quote",.
84f0: 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22    "tcl",.  "csv"
8500: 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20  ,.  "explain",. 
8510: 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65   "ascii",.  "pre
8520: 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22 65 71  ttyprint",.  "eq
8530: 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p".};../*.** The
8540: 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75 6d  se are the colum
8550: 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72  n/row/line separ
8560: 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74 68  ators used by th
8570: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70  e various.** imp
8580: 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73  ort/export modes
8590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 50  ..*/.#define SEP
85a0: 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23  _Column    "|".#
85b0: 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20 20  define SEP_Row  
85c0: 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e       "\n".#defin
85d0: 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20 20  e SEP_Tab       
85e0: 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45 50  "\t".#define SEP
85f0: 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a 23  _Space     " ".#
8600: 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61  define SEP_Comma
8610: 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e 65       ",".#define
8620: 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20 22   SEP_CrLf      "
8630: 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45  \r\n".#define SE
8640: 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78 31  P_Unit      "\x1
8650: 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  F".#define SEP_R
8660: 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22 0a  ecord    "\x1E".
8670: 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62 61 63  ./*.** A callbac
8680: 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
8690: 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66 61 63  3_log() interfac
86a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
86b0: 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69 64 20  d shellLog(void 
86c0: 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72 43  *pArg, int iErrC
86d0: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
86e0: 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c 6c 53  *zMsg){.  ShellS
86f0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
8700: 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 69  State*)pArg;.  i
8710: 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20  f( p->pLog==0 ) 
8720: 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38 5f 70  return;.  utf8_p
8730: 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20 22  rintf(p->pLog, "
8740: 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72 72  (%d) %s\n", iErr
8750: 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66  Code, zMsg);.  f
8760: 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a  flush(p->pLog);.
8770: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
8780: 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70 75  ction:  shell_pu
8790: 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72  tsnl(X).**.** Wr
87a0: 69 74 65 20 74 68 65 20 74 65 78 74 20 58 20 74  ite the text X t
87b0: 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28 6f 72  o the screen (or
87c0: 20 77 68 61 74 65 76 65 72 20 6f 75 74 70 75 74   whatever output
87d0: 20 69 73 20 62 65 69 6e 67 20 64 69 72 65 63 74   is being direct
87e0: 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20 61 20  ed).** adding a 
87f0: 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65 20 65  newline at the e
8800: 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72 65 74  nd, and then ret
8810: 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn X..*/.static
8820: 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74 73 46   void shellPutsF
8830: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8840: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8850: 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
8860: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
8870: 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  l.){.  ShellStat
8880: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
8890: 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  te*)sqlite3_user
88a0: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 28  _data(pCtx);.  (
88b0: 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75 74 66  void)nVal;.  utf
88c0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
88d0: 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
88e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
88f0: 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65  l[0]));.  sqlite
8900: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
8910: 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a  Ctx, apVal[0]);.
8920: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
8930: 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28 56 41  ction:   edit(VA
8940: 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  LUE).**         
8950: 20 20 20 20 20 20 20 20 65 64 69 74 28 56 41 4c          edit(VAL
8960: 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a  UE,EDITOR).**.**
8970: 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a 2a 2a   These steps:.**
8980: 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72 69 74  .**     (1) Writ
8990: 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61 20 74  e VALUE into a t
89a0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
89b0: 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20 70 72  *     (2) Run pr
89c0: 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f 6e 20  ogram EDITOR on 
89d0: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 66  that temporary f
89e0: 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  ile..**     (3) 
89f0: 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f 72 61  Read the tempora
8a00: 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61 6e 64  ry file back and
8a10: 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f 6e 74   return its cont
8a20: 65 6e 74 20 61 73 20 74 68 65 20 72 65 73 75 6c  ent as the resul
8a30: 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 44 65  t..**     (4) De
8a40: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
8a50: 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66  ry file.**.** If
8a60: 20 74 68 65 20 45 44 49 54 4f 52 20 61 72 67 75   the EDITOR argu
8a70: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 2c  ment is omitted,
8a80: 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
8a90: 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a 2a 20  n the VISUAL.** 
8aa0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
8ab0: 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c 6c 20  able.  If still 
8ac0: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44 49 54  there is no EDIT
8ad0: 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e 20 65  OR, through an e
8ae0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rror..**.** Also
8af0: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   throw an error 
8b00: 69 66 20 74 68 65 20 45 44 49 54 4f 52 20 70 72  if the EDITOR pr
8b10: 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20 61 20  ogram returns a 
8b20: 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20 63 6f  non-zero exit co
8b30: 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  de..*/.#ifndef S
8b40: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
8b50: 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TEM.static void 
8b60: 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  editFunc(.  sqli
8b70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8b80: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
8b90: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8ba0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
8bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69 74 6f  nst char *zEdito
8bc0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  r;.  char *zTemp
8bd0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
8be0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
8bf0: 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74  *zCmd = 0;.  int
8c00: 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72 63 3b   bBin;.  int rc;
8c10: 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c 20 3d  .  int hasCRNL =
8c20: 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20   0;.  FILE *f = 
8c30: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
8c40: 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74 65 33  64 sz;.  sqlite3
8c50: 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e 73 69  _int64 x;.  unsi
8c60: 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 30  gned char *p = 0
8c70: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32  ;..  if( argc==2
8c80: 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72 20   ){.    zEditor 
8c90: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
8ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8cb0: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 65  t(argv[1]);.  }e
8cc0: 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72  lse{.    zEditor
8cd0: 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53 55 41   = getenv("VISUA
8ce0: 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  L");.  }.  if( z
8cf0: 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  Editor==0 ){.   
8d00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8d10: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8d20: 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20 65 64  no editor for ed
8d30: 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20  it()", -1);.    
8d40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8d50: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
8d60: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
8d70: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
8d80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8d90: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8da0: 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20 65  "NULL input to e
8db0: 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20  dit()", -1);.   
8dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64   return;.  }.  d
8dd0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
8de0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
8df0: 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d 70 46  ntext);.  zTempF
8e00: 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ile = 0;.  sqlit
8e10: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
8e20: 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43  db, 0, SQLITE_FC
8e30: 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
8e40: 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  , &zTempFile);. 
8e50: 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d   if( zTempFile==
8e60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8e70: 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b 0a 20  _uint64 r = 0;. 
8e80: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
8e90: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
8ea0: 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d 70 46   &r);.    zTempF
8eb0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
8ec0: 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 22  rintf("temp%llx"
8ed0: 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  , r);.    if( zT
8ee0: 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
8ef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8f00: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8f10: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72  ontext);.      r
8f20: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
8f30: 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69 74 65  .  bBin = sqlite
8f40: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
8f50: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  v[0])==SQLITE_BL
8f60: 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20 77 72  OB;.  /* When wr
8f70: 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65 20 74  iting the file t
8f80: 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64 6f 20  o be edited, do 
8f90: 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e 76 65  \n to \r\n conve
8fa0: 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74 65 6d  rsions on system
8fb0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61 6e 74  s.  ** that want
8fc0: 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64 69 6e   \r\n line endin
8fd0: 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f 70 65  gs */.  f = fope
8fe0: 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62 42 69  n(zTempFile, bBi
8ff0: 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22 29 3b  n ? "wb" : "w");
9000: 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20  .  if( f==0 ){. 
9010: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9020: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9030: 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20   "edit() cannot 
9040: 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 22 2c  open temp file",
9050: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9060: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9070: 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  }.  sz = sqlite3
9080: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
9090: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62 42 69  v[0]);.  if( bBi
90a0: 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66 77 72  n ){.    x = fwr
90b0: 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ite(sqlite3_valu
90c0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 2c  e_blob(argv[0]),
90d0: 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d 65   1, sz, f);.  }e
90e0: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
90f0: 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
9100: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
9110: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
9120: 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62  );.    /* Rememb
9130: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
9140: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72 69 67  t the value orig
9150: 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64  inally contained
9160: 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66 28   \r\n */.    if(
9170: 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a 2c 22   z && strstr(z,"
9180: 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61 73 43  \r\n")!=0 ) hasC
9190: 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20 3d  RNL = 1;.    x =
91a0: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
91b0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
91c0: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
91d0: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b    }.  fclose(f);
91e0: 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  f = 0;.  if( 
91f0: 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c  x!=sz ){.    sql
9200: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9210: 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69 74  r(context, "edit
9220: 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () could not wri
9230: 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c  te the whole fil
9240: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  e", -1);.    got
9250: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
9260: 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73 71  .  }.  zCmd = sq
9270: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
9280: 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69 74  s \"%s\"", zEdit
9290: 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  or, zTempFile);.
92a0: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b    if( zCmd==0 ){
92b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
92c0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
92d0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f  context);.    go
92e0: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
92f0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 73  ;.  }.  rc = sys
9300: 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71 6c  tem(zCmd);.  sql
9310: 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
9320: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
9330: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9340: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9350: 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64 20  EDITOR returned 
9360: 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b 0a  non-zero", -1);.
9370: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9380: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 20  nc_end;.  }.  f 
9390: 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c  = fopen(zTempFil
93a0: 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20  e, "rb");.  if( 
93b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
93c0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
93d0: 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  (context,.      
93e0: 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20 72  "edit() cannot r
93f0: 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 20  eopen temp file 
9400: 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31 29  after edit", -1)
9410: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9420: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9430: 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45 4b  fseek(f, 0, SEEK
9440: 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74  _END);.  sz = ft
9450: 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e 64  ell(f);.  rewind
9460: 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  (f);.  p = sqlit
9470: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 2b  e3_malloc64( sz+
9480: 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  (bBin==0) );.  i
9490: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
94a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
94b0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
94c0: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  t);.    goto edi
94d0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
94e0: 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20 31    x = fread(p, 1
94f0: 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63 6c 6f  , sz, f);.  fclo
9500: 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a  se(f);.  f = 0;.
9510: 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20    if( x!=sz ){. 
9520: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9530: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9540: 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64   "could not read
9550: 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20   back the whole 
9560: 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  file", -1);.    
9570: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
9580: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 42  nd;.  }.  if( bB
9590: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
95a0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34 28  3_result_blob64(
95b0: 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a 2c 20  context, p, sz, 
95c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
95d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
95e0: 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a 3b 0a  te3_int64 i, j;.
95f0: 20 20 20 20 69 66 28 20 68 61 73 43 52 4e 4c 20      if( hasCRNL 
9600: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
9610: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  he original cont
9620: 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e 20 64  ains \r\n then d
9630: 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  o no conversions
9640: 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20   back to \n */. 
9650: 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20 20 20       j = sz;.   
9660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9670: 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 69 64   If the file did
9680: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20   not originally 
9690: 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74 68 65  contain \r\n the
96a0: 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20 6e 65  n convert any ne
96b0: 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c 6e 20  w.      ** \r\n 
96c0: 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a  back into \n */.
96d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b        for(i=j=0;
96e0: 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<sz; i++){.   
96f0: 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d 3d 27       if( p[i]=='
9700: 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d 3d 27  \r' && p[i+1]=='
9710: 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \n' ) i++;.     
9720: 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d     p[j++] = p[i]
9730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9740: 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 5b  sz = j;.      p[
9750: 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 20 0a  sz] = 0;.    } .
9760: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9770: 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78  lt_text64(contex
9780: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
9790: 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20 20  p, sz,.         
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53   sqlite3_free, S
97c0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d  QLITE_UTF8);.  }
97d0: 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f  .  p = 0;..edit_
97e0: 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20  func_end:.  if( 
97f0: 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  f ) fclose(f);. 
9800: 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c   unlink(zTempFil
9810: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
9820: 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  ee(zTempFile);. 
9830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9840: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9850: 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
9860: 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  EM */../*.** Sav
9870: 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68 65  e or restore the
9880: 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
9890: 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  mode.*/.static v
98a0: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 75  oid outputModePu
98b0: 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sh(ShellState *p
98c0: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f  ){.  p->modePrio
98d0: 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d  r = p->mode;.  m
98e0: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50  emcpy(p->colSepP
98f0: 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  rior, p->colSepa
9900: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
9910: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
9920: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
9930: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77  SepPrior, p->row
9940: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9950: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9960: 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  r));.}.static vo
9970: 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70  id outputModePop
9980: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
9990: 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e  .  p->mode = p->
99a0: 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d  modePrior;.  mem
99b0: 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  cpy(p->colSepara
99c0: 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72  tor, p->colSepPr
99d0: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  ior, sizeof(p->c
99e0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20  olSeparator));. 
99f0: 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65   memcpy(p->rowSe
9a00: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53  parator, p->rowS
9a10: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9a20: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
9a30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9a40: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9a50: 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63  ing as a hex-enc
9a60: 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58  oded blob (eg. X
9a70: 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74  '1234' ).*/.stat
9a80: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
9a90: 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75  ex_blob(FILE *ou
9aa0: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
9ab0: 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29  Blob, int nBlob)
9ac0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
9ad0: 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72  r *zBlob = (char
9ae0: 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f   *)pBlob;.  raw_
9af0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
9b00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9b10: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f  Blob; i++){ raw_
9b20: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78  printf(out,"%02x
9b30: 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29  ",zBlob[i]&0xff)
9b40: 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ; }.  raw_printf
9b50: 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a  (out,"'");.}../*
9b60: 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e  .** Find a strin
9b70: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f  g that is not fo
9b80: 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20  und anywhere in 
9b90: 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70  z[].  Return a p
9ba0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
9bb0: 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  t string..**.** 
9bc0: 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e  Try to use zA an
9bd0: 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20  d zB first.  If 
9be0: 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72  both of those ar
9bf0: 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20  e already found 
9c00: 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d  in z[].** then m
9c10: 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69  ake up some stri
9c20: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  ng and store it 
9c30: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a 42  in the buffer zB
9c40: 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  uf..*/.static co
9c50: 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64  nst char *unused
9c60: 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  _string(.  const
9c70: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c90: 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20  Result must not 
9ca0: 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20  appear anywhere 
9cb0: 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in z */.  const 
9cc0: 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20  char *zA, const 
9cd0: 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54  char *zB,   /* T
9ce0: 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20 2a  ry these first *
9cf0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20  /.  char *zBuf  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
9d20: 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61  o store a genera
9d30: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ted string */.){
9d40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20  .  unsigned i = 
9d50: 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  0;.  if( strstr(
9d60: 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75  z, zA)==0 ) retu
9d70: 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72  rn zA;.  if( str
9d80: 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20  str(z, zB)==0 ) 
9d90: 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b  return zB;.  do{
9da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9db0: 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28  rintf(20,zBuf,"(
9dc0: 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29  %s%u)", zA, i++)
9dd0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73  ;.  }while( strs
9de0: 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b  tr(z,zBuf)!=0 );
9df0: 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a  .  return zBuf;.
9e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
9e10: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
9e20: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
9e30: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
9e40: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
9e50: 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
9e60: 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  o: output_quoted
9e70: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
9e80: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
9e90: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
9ea0: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
9eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
9ec0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9ed0: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
9ee0: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
9ef0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
9f00: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
9f10: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
9f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
9f30: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
9f40: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
9f50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9f60: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69  t, "'");.    whi
9f70: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
9f80: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9f90: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9fa0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
9fb0: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
9fc0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
9fd0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
9fe0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
9ff0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a000: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a010: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a020: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a030: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a040: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a050: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a060: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a070: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a090: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  +;.    }.    raw
a0a0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a0b0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74  );.  }.  setText
a0c0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
a0d0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
a0e0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
a0f0: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
a100: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
a110: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
a120: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c  .** Additionalll
a130: 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20 22  y , escape the "
a140: 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61  \n" and "\r" cha
a150: 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74 20  racters so that 
a160: 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67  they do not.** g
a170: 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  et corrupted by 
a180: 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e  end-of-line tran
a190: 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69  slation faciliti
a1a0: 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61  es in some opera
a1b0: 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
a1c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c  .**.** This is l
a1d0: 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  ike output_quote
a1e0: 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20 77  d_string() but w
a1f0: 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
a200: 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20   of the \r\n.** 
a210: 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d  escape mechanism
a220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a230: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
a240: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49  scaped_string(FI
a250: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
a260: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
a270: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
a280: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
a290: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
a2a0: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
a2b0: 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27   c!='\'' && c!='
a2c0: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20  \n' && c!='\r'; 
a2d0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
a2e0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
a2f0: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
a300: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
a310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c   const char *zNL
a320: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a330: 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20  char *zCR = 0;. 
a340: 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
a350: 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b      int nCR = 0;
a360: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b  .    char zBuf1[
a370: 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a  20], zBuf2[20];.
a380: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
a390: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
a3a0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
a3b0: 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nNL++;.      if(
a3c0: 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43   z[i]=='\r' ) nC
a3d0: 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  R++;.    }.    i
a3e0: 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20  f( nNL ){.      
a3f0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a400: 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20  "replace(");.   
a410: 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f     zNL = unused_
a420: 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c  string(z, "\\n",
a430: 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
a440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a450: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a460: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65  _printf(out, "re
a470: 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20  place(");.      
a480: 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
a490: 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c  ing(z, "\\r", "\
a4a0: 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20  \015", zBuf2);. 
a4b0: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
a4c0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a4d0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
a4e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
a4f0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
a500: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
a510: 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  r' && c!='\''; i
a520: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
a530: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
a540: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
a550: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
a560: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
a570: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
a580: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
a590: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a5a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
a5b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a5c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
a5d0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a5e0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
a5f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a600: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
a610: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
a620: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
a630: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a640: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20  , zNL);.        
a650: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a660: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
a670: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43  tf(out, "%s", zC
a680: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  R);.    }.    ra
a690: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
a6a0: 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20  ");.    if( nCR 
a6b0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a6c0: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
a6d0: 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29  char(13))", zCR)
a6e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a6f0: 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nNL ){.      raw
a700: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a710: 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20  %s',char(10))", 
a720: 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  zNL);.    }.  }.
a730: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75    setTextMode(ou
a740: 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 1);.}../*.** 
a750: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
a760: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
a770: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
a780: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
a790: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
a7a0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
a7b0: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
a7c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
a7d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
a7e0: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
a7f0: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
a800: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
a810: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
a820: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
a830: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a840: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a850: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a860: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66  =='"' ){.      f
a870: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a880: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22 27  .      fputc('"'
a890: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a8a0: 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b  e if( c=='\t' ){
a8b0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a8c0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a8d0: 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a  putc('t', out);.
a8e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a8f0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\n' ){.      f
a900: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a910: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e 27  .      fputc('n'
a920: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a930: 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b  e if( c=='\r' ){
a940: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a950: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a960: 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a  putc('r', out);.
a970: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
a980: 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20 29  sprint(c&0xff) )
a990: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a9a0: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
a9b0: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
a9c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
a9d0: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
a9e0: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
a9f0: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
aa00: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
aa10: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
aa20: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
aa30: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
aa40: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
aa50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
aa60: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
aa70: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
aa80: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
aa90: 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   i;.  if( z==0 )
aaa0: 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65   z = "";.  while
aab0: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( *z ){.    for(
aac0: 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20  i=0;   z[i].    
aad0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
aae0: 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='<'.           
aaf0: 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20   && z[i]!='&'.  
ab00: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
ab10: 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20  ]!='>'.         
ab20: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27     && z[i]!='\"'
ab30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
ab40: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20  z[i]!='\'';.    
ab50: 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69      i++){}.    i
ab60: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
ab70: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
ab80: 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20  "%.*s",i,z);.   
ab90: 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d   }.    if( z[i]=
aba0: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='<' ){.      ra
abb0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c  w_printf(out,"&l
abc0: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
abd0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b  if( z[i]=='&' ){
abe0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
abf0: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
ac00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
ac10: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
ac20: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
ac30: 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&gt;");.    }el
ac40: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22  se if( z[i]=='\"
ac50: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac60: 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74  rintf(out,"&quot
ac70: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
ac80: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
ac90: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
aca0: 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a  f(out,"&#39;");.
acb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
acd0: 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20    z += i + 1;.  
ace0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  }.}../*.** If a 
acf0: 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61  field contains a
ad00: 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64 65  ny character ide
ad10: 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20 69  ntified by a 1 i
ad20: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
ad30: 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74  ** array, then t
ad40: 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62  he string must b
ad50: 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56  e quoted for CSV
ad60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
ad70: 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51 75  t char needCsvQu
ad80: 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31  ote[] = {.  1, 1
ad90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ada0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
adb0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
adc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
add0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ade0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adf0: 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20  ,.  1, 0, 1, 0, 
ae00: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c  0, 0, 0, 1,   0,
ae10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae20: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
ae30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae40: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae50: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ae60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae70: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
ae80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
ae90: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aea0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aeb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aec0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aed0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aee0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aef0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
af00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af10: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af20: 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31   0, 0, 1,.  1, 1
af30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af40: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
af50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
af60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af70: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
af80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af90: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
afa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
afb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afc0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
afd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afe0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
aff0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b000: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b010: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b020: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b030: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b040: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b050: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b060: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b070: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b080: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b090: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b0a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0b0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0c0: 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a   1, 1, 1,.};../*
b0d0: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e  .** Output a sin
b0e0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e  gle term of CSV.
b0f0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63    Actually, p->c
b100: 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20 75  olSeparator is u
b110: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
b120: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
b130: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
b140: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
b150: 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullValue is.** t
b160: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
b170: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
b180: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
b190: 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a    The separator.
b1a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65  ** is only issue
b1b0: 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72 75  d if bSep is tru
b1c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b1d0: 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65  d output_csv(She
b1e0: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
b1f0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62  t char *z, int b
b200: 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  Sep){.  FILE *ou
b210: 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66  t = p->out;.  if
b220: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( z==0 ){.    ut
b230: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
b240: 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  s",p->nullValue)
b250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
b260: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nt i;.    int nS
b270: 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
b280: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
b290: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
b2a0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
b2b0: 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  f( needCsvQuote[
b2c0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
b2d0: 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20  )z)[i]].        
b2e0: 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f   || (z[i]==p->co
b2f0: 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  lSeparator[0] &&
b300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
b310: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
b320: 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  (z, p->colSepara
b330: 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20  tor, nSep)==0)) 
b340: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30  ){.        i = 0
b350: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b370: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
b380: 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
b390: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ed = sqlite3_mpr
b3a0: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
b3b0: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
b3c0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
b3d0: 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20  zQuoted);.      
b3e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
b3f0: 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oted);.    }else
b400: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
b410: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
b420: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
b430: 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75  f( bSep ){.    u
b440: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b450: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
b460: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
b470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b480: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
b490: 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20  he user presses 
b4a0: 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63  Ctrl-C.*/.static
b4b0: 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f   void interrupt_
b4c0: 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55  handler(int NotU
b4d0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
b4e0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
b4f0: 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75  );.  seenInterru
b500: 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e  pt++;.  if( seen
b510: 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65 78  Interrupt>2 ) ex
b520: 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f  it(1);.  if( glo
b530: 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f  balDb ) sqlite3_
b540: 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c  interrupt(global
b550: 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66  Db);.}..#if (def
b560: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
b570: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
b580: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  && !defined(_WIN
b590: 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68  32_WCE)./*.** Th
b5a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
b5b0: 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e  for console even
b5c0: 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29  ts (e.g. Ctrl-C)
b5d0: 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61   on Win32.*/.sta
b5e0: 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  tic BOOL WINAPI 
b5f0: 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c  ConsoleCtrlHandl
b600: 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74  er(.  DWORD dwCt
b610: 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66  rlType /* One of
b620: 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e   the CTRL_*_EVEN
b630: 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29  T constants */.)
b640: 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54 79  {.  if( dwCtrlTy
b650: 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54  pe==CTRL_C_EVENT
b660: 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70   ){.    interrup
b670: 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20  t_handler(0);.  
b680: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
b690: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
b6a0: 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E;.}.#endif..#if
b6b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6c0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
b6d0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e  *.** When the ".
b6e0: 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c  auth ON" is set,
b6f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
b700: 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61  uthorizer callba
b710: 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ck is.** invoked
b720: 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
b730: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
b740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
b750: 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20  ellAuth(.  void 
b760: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  *pClientData,.  
b770: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
b780: 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e  char *zA1,.  con
b790: 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20  st char *zA2,.  
b7a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c  const char *zA3,
b7b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b7c0: 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  A4.){.  ShellSta
b7d0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
b7e0: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
b7f0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
b800: 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b   char *azAction[
b810: 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43  ] = { 0,.     "C
b820: 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20  REATE_INDEX",   
b830: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 41        "CREATE_TA
b840: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22 43  BLE",         "C
b850: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
b860: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
b870: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b880: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  "CREATE_TEMP_TRI
b890: 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f  GGER",  "CREATE_
b8a0: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b8b0: 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45 52   "CREATE_TRIGGER
b8c0: 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ",       "CREATE
b8d0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b8e0: 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20   "DELETE",.     
b8f0: 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20  "DROP_INDEX",   
b900: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41          "DROP_TA
b910: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  BLE",           
b920: 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  "DROP_TEMP_INDEX
b930: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",.     "DROP_TE
b940: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  MP_TABLE",      
b950: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  "DROP_TEMP_TRIGG
b960: 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45  ER",    "DROP_TE
b970: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
b980: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20  DROP_TRIGGER",  
b990: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45         "DROP_VIE
b9a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  W",            "
b9b0: 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50  INSERT",.     "P
b9c0: 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20  RAGMA",         
b9d0: 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20 20        "READ",   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
b9f0: 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52  ELECT",.     "TR
ba00: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20  ANSACTION",     
ba10: 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 20       "UPDATE",  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 54               "AT
ba30: 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54  TACH",.     "DET
ba40: 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACH",           
ba50: 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45      "ALTER_TABLE
ba60: 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45 49  ",          "REI
ba70: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41  NDEX",.     "ANA
ba80: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
ba90: 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41 42      "CREATE_VTAB
baa0: 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f  LE",        "DRO
bab0: 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20  P_VTABLE",.     
bac0: 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20  "FUNCTION",     
bad0: 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49          "SAVEPOI
bae0: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
baf0: 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b  "RECURSIVE".  };
bb00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
bb10: 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20  t char *az[4];. 
bb20: 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20   az[0] = zA1;.  
bb30: 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61  az[1] = zA2;.  a
bb40: 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a  z[2] = zA3;.  az
bb50: 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66  [3] = zA4;.  utf
bb60: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
bb70: 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73   "authorizer: %s
bb80: 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29  ", azAction[op])
bb90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34  ;.  for(i=0; i<4
bba0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f  ; i++){.    raw_
bbb0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bbc0: 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b   ");.    if( az[
bbd0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i] ){.      outp
bbe0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
bbf0: 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ut, az[i]);.    
bc00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
bc10: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
bc20: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
bc30: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
bc40: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
bc50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bc60: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
bc70: 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d  ** Print a schem
bc80: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61  a statement.  Pa
bc90: 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20  rt of MODE_Semi 
bca0: 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20  and MODE_Pretty 
bcb0: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
bcc0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65  is routine conve
bcd0: 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20  rts some CREATE 
bce0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
bcf0: 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c   for shadow tabl
bd00: 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f  es.** in FTS3/4/
bd10: 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41  5 into CREATE TA
bd20: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
bd30: 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  S statements..*/
bd40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
bd50: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c  ntSchemaLine(FIL
bd60: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
bd70: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
bd80: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28  r *zTail){.  if(
bd90: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
bda0: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b  ("CREATE TABLE [
bdb0: 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  '\"]*", z)==0 ){
bdc0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
bdd0: 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54 41  (out, "CREATE TA
bde0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
bdf0: 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a  S %s%s", z+13, z
be00: 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tail);.  }else{.
be10: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
be20: 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20  out, "%s%s", z, 
be30: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74  zTail);.  }.}.st
be40: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
be50: 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20  chemaLineN(FILE 
be60: 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69  *out, char *z, i
be70: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
be80: 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72   *zTail){.  char
be90: 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e   c = z[n];.  z[n
bea0: 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63  ] = 0;.  printSc
beb0: 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c  hemaLine(out, z,
bec0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20   zTail);.  z[n] 
bed0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = c;.}../*.** Re
bee0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74 72  turn true if str
bef0: 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74 68  ing z[] has noth
bf00: 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70 61  ing but whitespa
bf10: 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  ce and comments 
bf20: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
bf30: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e   the first line.
bf40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
bf50: 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68 61  sToEol(const cha
bf60: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
bf70: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
bf80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
bf90: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74 75  [i]=='\n' ) retu
bfa0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49 73  rn 1;.    if( Is
bfb0: 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63 6f  Space(z[i]) ) co
bfc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
bfd0: 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 69  z[i]=='-' && z[i
bfe0: 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72  +1]=='-' ) retur
bff0: 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
c000: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c010: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  1;.}../*.** Add 
c020: 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  a new entry to t
c030: 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
c040: 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74   PLAN data.*/.st
c050: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 61 70  atic void eqp_ap
c060: 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20  pend(ShellState 
c070: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 2c 20  *p, int iEqpId, 
c080: 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68  int p2, const ch
c090: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 45 51  ar *zText){.  EQ
c0a0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 77 3b  PGraphRow *pNew;
c0b0: 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73  .  int nText = s
c0c0: 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29 3b 0a  trlen30(zText);.
c0d0: 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51 50    if( p->autoEQP
c0e0: 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74 66 38  test ){.    utf8
c0f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c100: 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20 69 45  "%d,%d,%s\n", iE
c110: 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78 74 29  qpId, p2, zText)
c120: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  ;.  }.  pNew = s
c130: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
c140: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
c150: 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66 28 20   nText );.  if( 
c160: 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  pNew==0 ) shell_
c170: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
c180: 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49 64 20  .  pNew->iEqpId 
c190: 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e 65 77  = iEqpId;.  pNew
c1a0: 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20 70 32  ->iParentId = p2
c1b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
c1c0: 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20 6e  >zText, zText, n
c1d0: 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77 2d  Text+1);.  pNew-
c1e0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69 66  >pNext = 0;.  if
c1f0: 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73  ( p->sGraph.pLas
c200: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  t ){.    p->sGra
c210: 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  ph.pLast->pNext 
c220: 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65 7b  = pNew;.  }else{
c230: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70  .    p->sGraph.p
c240: 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  Row = pNew;.  }.
c250: 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73    p->sGraph.pLas
c260: 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  t = pNew;.}../*.
c270: 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73 65  ** Free and rese
c280: 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  t the EXPLAIN QU
c290: 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74 68  ERY PLAN data th
c2a0: 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c  at has been coll
c2b0: 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73  ected.** in p->s
c2c0: 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Graph..*/.static
c2d0: 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74 28   void eqp_reset(
c2e0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
c2f0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c300: 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66  Row, *pNext;.  f
c310: 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72  or(pRow = p->sGr
c320: 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b 20  aph.pRow; pRow; 
c330: 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20  pRow = pNext){. 
c340: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77 2d     pNext = pRow-
c350: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
c360: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c370: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d    }.  memset(&p-
c380: 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a 65  >sGraph, 0, size
c390: 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b 0a  of(p->sGraph));.
c3a0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
c3b0: 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51 55   next EXPLAIN QU
c3c0: 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77 69  ERY PLAN line wi
c3d0: 74 68 20 69 45 71 70 49 64 20 74 68 61 74 20 6f  th iEqpId that o
c3e0: 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a 20 70  ccurs after.** p
c3f0: 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e 20 74  Old, or return t
c400: 68 65 20 66 69 72 73 74 20 73 75 63 68 20 6c 69  he first such li
c410: 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20 4e 55  ne if pOld is NU
c420: 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45 51 50  LL.*/.static EQP
c430: 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f 6e 65  GraphRow *eqp_ne
c440: 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74 61 74  xt_row(ShellStat
c450: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c460: 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70  , EQPGraphRow *p
c470: 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68  Old){.  EQPGraph
c480: 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f 6c 64  Row *pRow = pOld
c490: 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74 20 3a   ? pOld->pNext :
c4a0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
c4b0: 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77 20 26  .  while( pRow &
c4c0: 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e 74 49  & pRow->iParentI
c4d0: 64 21 3d 69 45 71 70 49 64 20 29 20 70 52 6f 77  d!=iEqpId ) pRow
c4e0: 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a   = pRow->pNext;.
c4f0: 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b 0a 7d    return pRow;.}
c500: 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20 73 69  ../* Render a si
c510: 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74 68  ngle level of th
c520: 65 20 67 72 61 70 68 20 74 68 61 74 20 68 61 73  e graph that has
c530: 20 69 45 71 70 49 64 20 61 73 20 69 74 73 20 70   iEqpId as its p
c540: 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64 0a 2a  arent.  Called.*
c550: 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  * recursively to
c560: 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76 65 6c   render sublevel
c570: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c580: 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76  d eqp_render_lev
c590: 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  el(ShellState *p
c5a0: 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b 0a 20  , int iEqpId){. 
c5b0: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52   EQPGraphRow *pR
c5c0: 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ow, *pNext;.  in
c5d0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  t n = strlen30(p
c5e0: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c5f0: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  );.  char *z;.  
c600: 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70 5f 6e  for(pRow = eqp_n
c610: 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49  ext_row(p, iEqpI
c620: 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70 52 6f  d, 0); pRow; pRo
c630: 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20  w = pNext){.    
c640: 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65 78 74  pNext = eqp_next
c650: 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20  _row(p, iEqpId, 
c660: 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20 70  pRow);.    z = p
c670: 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20 20 20  Row->zText;.    
c680: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c690: 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22 2c 20  ut, "%s%s%s\n", 
c6a0: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c6b0: 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d 2d 22  x, pNext ? "|--"
c6c0: 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a 20 20   : "`--", z);.  
c6d0: 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73 69 7a    if( n<(int)siz
c6e0: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50  eof(p->sGraph.zP
c6f0: 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20 20 20  refix)-7 ){.    
c700: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47 72    memcpy(&p->sGr
c710: 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 2c 20  aph.zPrefix[n], 
c720: 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20 3a 20  pNext ? "|  " : 
c730: 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20 20 20  "   ", 4);.     
c740: 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65   eqp_render_leve
c750: 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71 70 49  l(p, pRow->iEqpI
c760: 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72  d);.      p->sGr
c770: 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 20 3d  aph.zPrefix[n] =
c780: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
c790: 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61  ./*.** Display a
c7a0: 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58 50  nd reset the EXP
c7b0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
c7c0: 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  data.*/.static v
c7d0: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 28 53  oid eqp_render(S
c7e0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
c7f0: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52   EQPGraphRow *pR
c800: 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e 70  ow = p->sGraph.p
c810: 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f 77 20  Row;.  if( pRow 
c820: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 77 2d  ){.    if( pRow-
c830: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27 20 29  >zText[0]=='-' )
c840: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 6f 77  {.      if( pRow
c850: 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ->pNext==0 ){.  
c860: 20 20 20 20 20 20 65 71 70 5f 72 65 73 65 74 28        eqp_reset(
c870: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
c880: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
c890: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c8a0: 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 70 52  >out, "%s\n", pR
c8b0: 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a 20 20  ow->zText+3);.  
c8c0: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 52      p->sGraph.pR
c8d0: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c8e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c8f0: 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 20 20  free(pRow);.    
c900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
c910: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c920: 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22 29   "QUERY PLAN\n")
c930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 73  ;.    }.    p->s
c940: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 30 5d  Graph.zPrefix[0]
c950: 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f 72 65   = 0;.    eqp_re
c960: 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 30 29  nder_level(p, 0)
c970: 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65 74 28  ;.    eqp_reset(
c980: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
c990: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
c9a0: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
c9b0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73 73 20  ./*.** Progress 
c9c0: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
c9d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c9e0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
c9f0: 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61  (void *pClientDa
ca00: 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53 74 61  ta) {.  ShellSta
ca10: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
ca20: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
ca30: 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  ;.  p->nProgress
ca40: 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 50 72  ++;.  if( p->nPr
ca50: 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50 72 6f  ogress>=p->mxPro
ca60: 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78 50 72  gress && p->mxPr
ca70: 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20 20 20  ogress>0 ){.    
ca80: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ca90: 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c 69 6d  t, "Progress lim
caa0: 69 74 20 72 65 61 63 68 65 64 20 28 25 75 29 5c  it reached (%u)\
cab0: 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  n", p->nProgress
cac0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  );.    if( p->fl
cad0: 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c  gProgress & SHEL
cae0: 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53 45 54  L_PROGRESS_RESET
caf0: 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 20   ) p->nProgress 
cb00: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
cb10: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cb20: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f 4e 43  ELL_PROGRESS_ONC
cb30: 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73  E ) p->mxProgres
cb40: 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
cb50: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 1;.  }.  if( (
cb60: 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26  p->flgProgress &
cb70: 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f   SHELL_PROGRESS_
cb80: 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20 20 20  QUIET)==0 ){.   
cb90: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
cba0: 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 25 75  ut, "Progress %u
cbb0: 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73  \n", p->nProgres
cbc0: 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
cbd0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
cbe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
cbf0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20 2a 2f  RESS_CALLBACK */
cc00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
cc10: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
cc20: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
cc30: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
cc40: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
cc50: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
cc60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
cc70: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ll_callback(.  v
cc80: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
cc90: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a   nArg,        /*
cca0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
ccb0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  t columns */.  c
ccc0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
ccd0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
cce0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
ccf0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
cd00: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
cd10: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  mes */.  int *ai
cd20: 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c  Type      /* Col
cd30: 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a  umn types */.){.
cd40: 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c    int i;.  Shell
cd50: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
cd60: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20  lState*)pArg;.. 
cd70: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
cd80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
cd90: 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a  ch( p->cMode ){.
cda0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
cdb0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
cdc0: 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  w = 5;.      if(
cdd0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
cde0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
cdf0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
ce00: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
ce10: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  = strlen30(azCol
ce20: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ce30: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66   "");.        if
ce40: 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65  ( len>w ) w = le
ce50: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
ce60: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20   if( p->cnt++>0 
ce70: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
ce80: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
ce90: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
cea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ceb0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
cec0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ced0: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
cee0: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
cef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf00: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
cf10: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
cf20: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
cf30: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
cf40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf50: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
cf60: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
cf70: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
cf80: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
cf90: 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e  nst int aExplain
cfa0: 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31  Widths[] = {4, 1
cfb0: 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20  3, 4, 4, 4, 13, 
cfc0: 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f  2, 13};.      co
cfd0: 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74  nst int *colWidt
cfe0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f  h;.      int sho
cff0: 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  wHdr;.      char
d000: 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20   *rowSep;.      
d010: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
d020: 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  DE_Column ){.   
d030: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
d040: 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  p->colWidth;.   
d050: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70       showHdr = p
d060: 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
d070: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70        rowSep = p
d080: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a  ->rowSeparator;.
d090: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0a0: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
d0b0: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a  aExplainWidths;.
d0c0: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
d0d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  = 1;.        row
d0e0: 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20  Sep = SEP_Row;. 
d0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d100: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
d110: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d120: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
d130: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
d140: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
d150: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
d160: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
d170: 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c           w = col
d180: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
d190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d1a0: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
d1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1c0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d1e0: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c  strlenChar(azCol
d1f0: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
d200: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
d210: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
d220: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
d230: 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   n = strlenChar(
d240: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
d250: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d260: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d270: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
d280: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
d290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d2a0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
d2b0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
d2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d2d0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
d2e0: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
d2f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
d300: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
d310: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
d320: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
d330: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20   w, azCol[i]);. 
d340: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
d350: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d360: 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f  %s", i==nArg-1 ?
d370: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
d380: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d3a0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d3b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d3c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
d3d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
d3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d3f0: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
d400: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
d410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d420: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
d430: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
d440: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20        if( w<0 ) 
d450: 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20  w = -w;.        
d460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d470: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
d480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d490: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d4a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d4b0: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20  %-*.*s%s",w,w,. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 22 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 2d 2d  ----------------
d550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
d580: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
d590: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d5a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d5b0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
d5c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d5d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
d5e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
d5f0: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66  nt w;.        if
d600: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
d610: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
d620: 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  .           w = 
d630: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
d640: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
d650: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
d660: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
d670: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d         if( p->cM
d680: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
d690: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
d6a0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
d6b0: 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20  g[i])>w ){.     
d6c0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
d6d0: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  har(azArg[i]);. 
d6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d6f0: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
d700: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
d710: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
d720: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
d730: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
d740: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
d750: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d760: 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65  %*.s", p->aiInde
d770: 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20  nt[p->iIndent], 
d780: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "");.          }
d790: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49  .          p->iI
d7a0: 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ndent++;.       
d7b0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
d7c0: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
d7d0: 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20  ut, w, azArg[i] 
d7e0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
d7f0: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
d800: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d810: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
d820: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
d830: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
d840: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d850: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d860: 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20  DE_Semi: {   /* 
d870: 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c  .schema and .ful
d880: 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a  lschema output *
d890: 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  /.      printSch
d8a0: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
d8b0: 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29  azArg[0], ";\n")
d8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d8d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d8e0: 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a  DE_Pretty: {  /*
d8f0: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
d900: 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d  llschema with --
d910: 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  indent */.      
d920: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
d930: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
d940: 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nParen = 0;.    
d950: 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b    char cEnd = 0;
d960: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
d970: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d       int nLine =
d980: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
d990: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
d9a0: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d     if( azArg[0]=
d9b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d9c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
d9d0: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56 49  rlike("CREATE VI
d9e0: 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  EW%", azArg[0], 
d9f0: 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  0)==0.       || 
da00: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
da10: 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c 20  "CREATE TRIG%", 
da20: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
da30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
da40: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
da50: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a  out, "%s;\n", az
da60: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
da70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
da80: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
da90: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
daa0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
dab0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   j = 0;.      fo
dac0: 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a  r(i=0; IsSpace(z
dad0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
dae0: 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b     for(; (c = z[
daf0: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
db00: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
db10: 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e(c) ){.        
db20: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c    if( z[j-1]=='\
db30: 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c  r' ) z[j-1] = '\
db40: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n';.          if
db50: 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  ( IsSpace(z[j-1]
db60: 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27  ) || z[j-1]=='('
db70: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
db80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
db90: 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27  c=='(' || c==')'
dba0: 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70  ) && j>0 && IsSp
dbb0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20  ace(z[j-1]) ){. 
dbc0: 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20           j--;.  
dbd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dbe0: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
dbf0: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
dc00: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
dc10: 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20  z[j-1]) ){ j--; 
dc20: 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30  }.      z[j] = 0
dc30: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ;.      if( strl
dc40: 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20  en30(z)>=79 ){. 
dc50: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30         for(i=j=0
dc60: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
dc70: 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20   i++){  /* Copy 
dc80: 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69  changes from z[i
dc90: 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a  ] back to z[j] *
dca0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
dcb0: 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20  c==cEnd ){.     
dcc0: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b         cEnd = 0;
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
dce0: 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63   if( c=='"' || c
dcf0: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27  =='\'' || c=='`'
dd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
dd10: 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20  cEnd = c;.      
dd20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
dd30: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
dd40: 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a      cEnd = ']';.
dd50: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
dd60: 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b  if( c=='-' && z[
dd70: 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  i+1]=='-' ){.   
dd80: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dd90: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
dda0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27  }else if( c=='('
ddb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ddc0: 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  nParen++;.      
ddd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
dde0: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
ddf0: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
de00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c            if( nL
de10: 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d  ine>0 && nParen=
de20: 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20  =0 && j>0 ){.   
de30: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
de40: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
de50: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b  ut, z, j, "\n");
de60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
de70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
de80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
de90: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
dea0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
deb0: 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26  if( nParen==1 &&
dec0: 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20   cEnd==0.       
ded0: 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c      && (c=='(' |
dee0: 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d  | c=='\n' || (c=
def0: 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c  =',' && !wsToEol
df00: 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20  (z+i+1))).      
df10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
df20: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
df30: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20   j--;.          
df40: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
df50: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
df60: 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20   "\n  ");.      
df70: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
df80: 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b           nLine++
df90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
dfa0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69  ile( IsSpace(z[i
dfb0: 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  +1]) ){ i++; }. 
dfc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dfd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
dfe0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
dff0: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
e000: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  Line(p->out, z, 
e010: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  ";\n");.      sq
e020: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
e030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e040: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
e050: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
e060: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
e070: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
e080: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e090: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e0b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
e0c0: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  s%s",azCol[i],. 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e   i==nArg-1 ? p->
e0f0: 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70  rowSeparator : p
e100: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
e110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e120: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e130: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e140: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e150: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e160: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
e170: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
e180: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
e190: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20  ->nullValue;.   
e1a0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e1b0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
e1c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
e1d0: 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20  <nArg-1 ){.     
e1e0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e1f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e200: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
e210: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e220: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e230: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e240: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e250: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
e260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e270: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e280: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
e290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
e2a0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
e2b0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
e2c0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e2d0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
e2e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e2f0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e300: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e310: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
e320: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
e330: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
e340: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
e350: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
e360: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
e370: 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TH>\n");.      
e380: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
e390: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
e3a0: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
e3b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
e3c0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
e3d0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e3e0: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
e3f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e400: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e410: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e420: 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20  ->out,"<TD>");. 
e430: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
e440: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
e450: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
e460: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
e470: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72  alue);.        r
e480: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e490: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
e4a0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
e4b0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
e4c0: 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  TR>\n");.      b
e4d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e4e0: 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b  case MODE_Tcl: {
e4f0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
e500: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
e510: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
e520: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e530: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e540: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
e550: 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c  ing(p->out,azCol
e560: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
e570: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
e580: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
e590: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e5a0: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
e5b0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
e5c0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
e5d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e5e0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e5f0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
e600: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e610: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e620: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e640: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
e650: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e660: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
e670: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
e680: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
e690: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
e6a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
e6b0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
e6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
e6d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e6e0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e6f0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
e700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e710: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
e720: 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
e730: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
e740: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
e750: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
e760: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
e770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e780: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e790: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
e7a0: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
e7b0: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
e7c0: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
e7d0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e7e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e7f0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e800: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e810: 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a    if( nArg>0 ){.
e820: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e830: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e840: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e850: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
e860: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
e870: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
e880: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e890: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e8a0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e8b0: 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74 4d  }.      setTextM
e8c0: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
e8d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e8e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e8f0: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
e900: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
e910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66  break;.      utf
e920: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e930: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22  "INSERT INTO %s"
e940: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
e950: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
e960: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e970: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e980: 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20  ->out,"(");.    
e990: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e9a0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e9b0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
e9c0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e9d0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
e9e0: 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72 28    if( quoteChar(
e9f0: 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  azCol[i]) ){.   
ea00: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
ea10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
ea20: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43  tf("\"%w\"", azC
ea30: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
ea40: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ea50: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
ea60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ea70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
ea80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
eaa0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
eab0: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
eac0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ead0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
eae0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
eaf0: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
eb00: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
eb10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
eb20: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
eb30: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
eb40: 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20  >out, i>0 ? "," 
eb50: 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20  : " VALUES(");. 
eb60: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
eb70: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
eb80: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
eb90: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
eba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
ebb0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ebc0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
ebd0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
ebe0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
ebf0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
ec00: 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65 6c          if( Shel
ec10: 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
ec20: 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20  G_Newlines) ){. 
ec30: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
ec40: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
ec50: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
ec70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ec80: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
ec90: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
eca0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
ecb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ecc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
ecd0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ece0: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
ecf0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
ed00: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
ed10: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
ed20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ed30: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
ed40: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
ed50: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
ed60: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
ed70: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
ed80: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
ed90: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
eda0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
edb0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
edc0: 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  4 ur;.          
edd0: 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69  memcpy(&ur,&r,si
ede0: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20  zeof(r));.      
edf0: 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66      if( ur==0x7f
ee00: 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c  f0000000000000LL
ee10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ee20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ee30: 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20  t, "1e999");.   
ee40: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ee50: 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30   ur==0xfff000000
ee60: 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20  0000000LL ){.   
ee70: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
ee80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65  ntf(p->out, "-1e
ee90: 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20  999");.         
eea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eeb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
eec0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
eed0: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
eee0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
eef0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
ef00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ef10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ef20: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ef30: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
ef40: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
ef50: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
ef60: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
ef70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
ef80: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
ef90: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
efa0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
efb0: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
efc0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
efd0: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
efe0: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
eff0: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
f000: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
f010: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
f020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
f030: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f040: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
f050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
f060: 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67  if( ShellHasFlag
f070: 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  (p, SHFLG_Newlin
f080: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  es) ){.         
f090: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
f0a0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f0b0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f0c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f0d0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
f0e0: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
f0f0: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
f100: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f110: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
f120: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c  intf(p->out,");\
f130: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
f140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f150: 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20   MODE_Quote: {. 
f160: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
f170: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f180: 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26   if( p->cnt==0 &
f190: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
f1b0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f1c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
f1d0: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
f1e0: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
f1f0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f200: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
f210: 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  >out, azCol[i]);
f220: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f230: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f240: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
f250: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
f260: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
f270: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
f280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30  .        if( i>0
f290: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
f2a0: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
f2b0: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
f2c0: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
f2d0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f2e0: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
f2f0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
f300: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
f310: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
f320: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
f330: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
f340: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
f350: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
f360: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f370: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f380: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
f390: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
f3a0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
f3b0: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
f3c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f3d0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f3e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f3f0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
f400: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
f410: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
f420: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
f430: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
f440: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
f450: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
f460: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f470: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f480: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
f490: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
f4a0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
f4b0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
f4c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f4d0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f4e0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
f4f0: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
f500: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
f510: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
f520: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
f530: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
f540: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
f550: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
f560: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
f570: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f580: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
f590: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
f5a0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
f5b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
f5c0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f5d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f5e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f5f0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f600: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f610: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
f620: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
f630: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
f640: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
f650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
f660: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f670: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
f680: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f690: 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a  e MODE_Ascii: {.
f6a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
f6b0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
f6c0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
f6d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
f6e0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
f6f0: 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66     if( i>0 ) utf
f700: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f710: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
f720: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
f730: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f740: 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c  ->out,"%s",azCol
f750: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
f760: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   "");.        }.
f770: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
f780: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f790: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f7a0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f7b0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
f7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
f7d0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f7e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f7f0: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
f800: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f810: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
f820: 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
f830: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f840: 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  s",azArg[i] ? az
f850: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
f860: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Value);.      }.
f870: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f880: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
f890: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
f8a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f8b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
f8c0: 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20  DE_EQP: {.      
f8d0: 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74  eqp_append(p, at
f8e0: 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74  oi(azArg[0]), at
f8f0: 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a  oi(azArg[1]), az
f900: 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62  Arg[3]);.      b
f910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f930: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
f940: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
f950: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
f960: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
f970: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
f980: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
f990: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
f9a0: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
f9b0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
f9c0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
f9d0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
f9e0: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
f9f0: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
fa00: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
fa10: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
fa20: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
fa30: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
fa40: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
fa50: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
fa60: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
fa70: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
fa80: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
fa90: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
faa0: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
fab0: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
fac0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
fad0: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
fae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
faf0: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
fb00: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
fb10: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
fb20: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
fb30: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
fb40: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
fb50: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
fb60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
fb70: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
fb80: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
fb90: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20  n 0;.  if( p->n 
fba0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
fbb0: 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  "|", 0);.  for(i
fbc0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
fbd0: 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61 70  {.    if( i ) ap
fbe0: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c  pendText(p, ",",
fbf0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41   0);.    if( azA
fc00: 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65  rg[i] ) appendTe
fc10: 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  xt(p, azArg[i], 
fc20: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
fc30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
fc40: 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  erate an appropr
fc50: 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74 61  iate SELFTEST ta
fc60: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
fc70: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
fc80: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
fc90: 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68 65  elftestTable(She
fca0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63  llState *p){.  c
fcb0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
fcc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
fcd0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56  (p->db,.    "SAV
fce0: 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f  EPOINT selftest_
fcf0: 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52  init;\n".    "CR
fd00: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
fd10: 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65 73  T EXISTS selftes
fd20: 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f  t(\n".    "  tno
fd30: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
fd40: 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65   KEY,\n"   /* Te
fd50: 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  st number */.   
fd60: 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20   "  op TEXT,\n" 
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20    /* Operator:  
fd90: 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20  memo run */.    
fda0: 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20  "  cmd TEXT,\n" 
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74   /* Command text
fdd0: 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54   */.    "  ans T
fde0: 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20  EXT\n"          
fdf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69           /* Desi
fe00: 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20  red answer */.  
fe10: 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41    ");".    "CREA
fe20: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f  TE TEMP TABLE [_
fe30: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63  shell$self](op,c
fe40: 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20  md,ans);\n".    
fe50: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
fe60: 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64  hell$self](rowid
fe70: 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20  ,op,cmd)\n".    
fe80: 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73  "  VALUES(coales
fe90: 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28  ce((SELECT (max(
fea0: 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f  tno)+100)/10 FRO
feb0: 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c  M selftest),10),
fec0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
fed0: 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20    'memo','Tests 
fee0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69  generated by --i
fef0: 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  nit');\n".    "I
ff00: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
ff10: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
ff20: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
ff30: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  \n".    "    'SE
ff40: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
ff50: 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79 70  ery(''SELECT typ
ff60: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
ff70: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
ffa0: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
ffb0: 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c   BY 2'',224))',\
ffc0: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
ffd0: 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45  sha3_query('SELE
ffe0: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
fff0: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
10020 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
10030 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a  BY 2',224));\n".
10040 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
10050 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
10060 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
10070 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20  'run',".    "   
10080 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
10090 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
100a0 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a   * FROM \"' ||".
100b0 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72 69      "        pri
100c0 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c  ntf('%w',name) |
100d0 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  | '\" NOT INDEXE
100e0 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  D'',224))',\n". 
100f0 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
10100 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27 53  _query(printf('S
10110 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
10120 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  w\" NOT INDEXED'
10130 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a  ,name),224))\n".
10140 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22      "  FROM (\n"
10150 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
10160 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
10170 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20  e_master\n".    
10180 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65  "     WHERE type
10190 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20  ='table'\n".    
101a0 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65  "       AND name
101b0 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a  <>'selftest'\n".
101c0 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
101d0 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
101e0 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20  e,0)>0\n".    " 
101f0 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45   )\n".    " ORDE
10200 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20  R BY name;\n".  
10210 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
10220 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
10230 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27 72      "  VALUES('r
10240 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
10250 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
10260 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
10270 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74  RT INTO selftest
10280 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29  (tno,op,cmd,ans)
10290 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
102a0 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c  rowid*10,op,cmd,
102b0 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c  ans FROM [_shell
102c0 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22  $self];\n".    "
102d0 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  DROP TABLE [_she
102e0 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c  ll$self];".    ,
102f0 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20  0,0,&zErrMsg);. 
10300 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
10310 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10320 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53  stderr, "SELFTES
10330 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  T initialization
10340 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c   failure: %s\n",
10350 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
10360 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
10370 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
10380 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
10390 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73  "RELEASE selftes
103a0 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a  t_init",0,0,0);.
103b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
103c0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
103d0 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
103e0 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75   ShellState stru
103f0 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
10400 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
10410 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
10420 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
10430 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
10440 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
10450 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
10460 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53  able_name(ShellS
10470 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
10480 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
10490 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
104a0 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a  cQuote;.  char *
104b0 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65  z;..  if( p->zDe
104c0 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  stTable ){.    f
104d0 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c  ree(p->zDestTabl
104e0 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74  e);.    p->zDest
104f0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Table = 0;.  }. 
10500 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
10510 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65  return;.  cQuote
10520 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61   = quoteChar(zNa
10530 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  me);.  n = strle
10540 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  n30(zName);.  if
10550 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20  ( cQuote ) n += 
10560 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  n+2;.  z = p->zD
10570 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
10580 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
10590 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  z==0 ) shell_out
105a0 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
105b0 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75  n = 0;.  if( cQu
105c0 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
105d0 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Quote;.  for(i=0
105e0 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
105f0 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
10600 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
10610 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74   zName[i]==cQuot
10620 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
10630 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ote;.  }.  if( c
10640 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
10650 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20   cQuote;.  z[n] 
10660 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  = 0;.}.../*.** E
10670 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73  xecute a query s
10680 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
10690 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20  ll generate SQL 
106a0 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a  output.  Print.*
106b0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  * the result col
106c0 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61  umns, comma-sepa
106d0 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65  rated, on a line
106e0 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a   and then add a.
106f0 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  ** semicolon ter
10700 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65  minator to the e
10710 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e  nd of that line.
10720 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
10730 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10740 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f  is 1 and that co
10750 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65  lumn contains te
10760 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20  xt "--".** then 
10770 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f  write the semico
10780 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74  lon on a separat
10790 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61  e line.  That wa
107a0 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20  y, if a.** "--" 
107b0 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61  comment occurs a
107c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
107d0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
107e0 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74  comment.** won't
107f0 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d   consume the sem
10800 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
10810 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10820 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
10830 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
10840 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
10850 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65    /* Query conte
10860 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
10870 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20  ar *zSelect,    
10880 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
10890 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20  ment to extract 
108a0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  content */.  con
108b0 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52  st char *zFirstR
108c0 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62  ow    /* Print b
108d0 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c  efore first row,
108e0 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
108f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
10900 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e  t *pSelect;.  in
10910 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73  t rc;.  int nRes
10920 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
10930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
10950 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
10960 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53  zSelect, -1, &pS
10970 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
10980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
10990 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  | !pSelect ){.  
109a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
109b0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
109c0 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
109d0 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
109e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
109f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10a00 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10a10 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10a20 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10a30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10a40 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10a50 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
10a60 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73  );.  nResult = s
10a70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
10a80 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  unt(pSelect);.  
10a90 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
10aa0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
10ab0 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20   zFirstRow ){.  
10ac0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10ad0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46  p->out, "%s", zF
10ae0 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  irstRow);.      
10af0 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20  zFirstRow = 0;. 
10b00 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f     }.    z = (co
10b10 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
10b20 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10b30 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75  elect, 0);.    u
10b40 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10b50 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
10b60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73   for(i=1; i<nRes
10b70 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
10b80 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10b90 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69  out, ",%s", sqli
10ba0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10bb0 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20  pSelect, i));.  
10bc0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30    }.    if( z==0
10bd0 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77   ) z = "";.    w
10be0 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a  hile( z[0] && (z
10bf0 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d  [0]!='-' || z[1]
10c00 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20  !='-') ) z++;.  
10c10 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20    if( z[0] ){.  
10c20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10c30 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b  ->out, "\n;\n");
10c40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10c50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10c60 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
10c70 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10c80 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
10c90 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10ca0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10cb0 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72  Select);.  if( r
10cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10cd0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10ce0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
10cf0 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
10d00 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10d20 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10d30 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
10d40 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10d50 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10d60 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
10d70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
10d80 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64  locate space and
10d90 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e   save off curren
10da0 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  t error string..
10db0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
10dc0 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20  save_err_msg(.  
10dd0 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20  sqlite3 *db     
10de0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10df0 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29  se to query */.)
10e00 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20  {.  int nErrMsg 
10e10 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c  = 1+strlen30(sql
10e20 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
10e30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
10e40 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
10e50 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20  oc64(nErrMsg);. 
10e60 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
10e70 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d      memcpy(zErrM
10e80 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  sg, sqlite3_errm
10e90 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29  sg(db), nErrMsg)
10ea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
10eb0 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65  ErrMsg;.}..#ifde
10ec0 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
10ed0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73  * Attempt to dis
10ee0 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f  play I/O stats o
10ef0 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70  n Linux using /p
10f00 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74  roc/PID/io.*/.st
10f10 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
10f20 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49  yLinuxIoStats(FI
10f30 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45  LE *out){.  FILE
10f40 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32   *in;.  char z[2
10f50 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
10f60 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
10f70 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f  ), z, "/proc/%d/
10f80 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  io", getpid());.
10f90 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20    in = fopen(z, 
10fa0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
10fb0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
10fc0 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73  hile( fgets(z, s
10fd0 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30  izeof(z), in)!=0
10fe0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
10ff0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
11000 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11010 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
11020 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
11030 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b  c;.    } aTrans[
11040 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72  ] = {.      { "r
11050 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
11060 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
11070 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61   received by rea
11080 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  d():" },.      {
11090 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "wchar: ",     
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
110b0 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74  tes sent to writ
110c0 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  e():"    },.    
110d0 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20    { "syscr: ",  
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63  "Read() system c
11100 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20  alls:"      },. 
11110 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22       { "syscw: "
11120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11130 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74     "Write() syst
11140 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d  em calls:"     }
11150 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f  ,.      { "read_
11160 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
11170 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61        "Bytes rea
11180 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22  d from storage:"
11190 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72    },.      { "wr
111a0 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ite_bytes: ",   
111b0 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
111c0 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61  written to stora
111d0 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ge:" },.      { 
111e0 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65  "cancelled_write
111f0 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e  _bytes: ",  "Can
11200 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74  celled write byt
11210 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d  es:"    },.    }
11220 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
11230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
11240 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69  ySize(aTrans); i
11250 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
11260 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61   = strlen30(aTra
11270 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b  ns[i].zPattern);
11280 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
11290 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  mp(aTrans[i].zPa
112a0 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20  ttern, z, n)==0 
112b0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
112c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
112d0 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69  6s %s", aTrans[i
112e0 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b  ].zDesc, &z[n]);
112f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11310 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
11320 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
11330 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65  Display a single
11340 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20   line of status 
11350 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c  using 64-bit val
11360 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
11370 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c  oid displayStatL
11380 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ine(.  ShellStat
11390 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
113a0 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f   /* The shell co
113b0 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20  ntext */.  char 
113c0 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20  *zLabel,        
113d0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
113e0 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20  r this one line 
113f0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d  */.  char *zForm
11400 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  at,            /
11410 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  * Format for the
11420 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
11430 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20   iStatusCtrl,   
11440 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
11450 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61  status to displa
11460 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  y */.  int bRese
11470 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11480 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
11490 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
114a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
114b0 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  4 iCur = -1;.  s
114c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69  qlite3_int64 iHi
114d0 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wtr = -1;.  int 
114e0 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63  i, nPercent;.  c
114f0 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a  har zLine[200];.
11500 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
11510 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20  64(iStatusCtrl, 
11520 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11530 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69  bReset);.  for(i
11540 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20  =0, nPercent=0; 
11550 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29  zFormat[i]; i++)
11560 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61  {.    if( zForma
11570 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72  t[i]=='%' ) nPer
11580 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  cent++;.  }.  if
11590 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a  ( nPercent>1 ){.
115a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
115b0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
115c0 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
115d0 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  at, iCur, iHiwtr
115e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
115f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11600 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
11610 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
11620 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72  iHiwtr);.  }.  r
11630 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
11640 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
11650 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a  zLabel, zLine);.
11660 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
11670 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a   memory stats..*
11680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
11690 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71  play_stats(.  sq
116a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
116b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
116c0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
116d0 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
116e0 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
116f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
11700 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ellState */.  in
11710 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
11720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11730 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
11740 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tats */.){.  int
11750 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69   iCur;.  int iHi
11760 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  wtr;.  FILE *out
11770 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20  ;.  if( pArg==0 
11780 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20  || pArg->out==0 
11790 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75  ) return 0;.  ou
117a0 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a  t = pArg->out;..
117b0 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d    if( pArg->pStm
117c0 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74  t && (pArg->stat
117d0 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20  sOn & 2) ){.    
117e0 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a  int nCol, i, x;.
117f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11800 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e   *pStmt = pArg->
11810 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
11820 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c  z[100];.    nCol
11830 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
11840 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
11850 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
11860 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22  ut, "%-36s %d\n"
11870 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  , "Number of out
11880 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e  put columns:", n
11890 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Col);.    for(i=
118a0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
118b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
118c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
118d0 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25  ),z,"Column %d %
118e0 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b  nname:", i, &x);
118f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11900 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11910 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11920 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
11930 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20  mt,i));.#ifndef 
11940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
11950 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74  TYPE.      sqlit
11960 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11970 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74  z+x, "declared t
11980 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ype:");.      ut
11990 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
119a0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
119b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
119c0 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69  ecltype(pStmt, i
119d0 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ));.#endif.#ifde
119e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
119f0 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
11a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11a10 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11a20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22  "database name:"
11a30 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11a40 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11a50 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11a60 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
11a70 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  se_name(pStmt,i)
11a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11a90 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
11aa0 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22  x, "table name:"
11ab0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11ac0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11ad0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11ae0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
11af0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11b10 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11b20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b  "origin name:");
11b30 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11b40 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11b50 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11b60 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
11b70 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23  ame(pStmt,i));.#
11b80 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11b90 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11ba0 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79  ne(pArg, "Memory
11bb0 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25   Used:",.     "%
11bc0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62  lld (max %lld) b
11bd0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11be0 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
11bf0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11c00 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11c10 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75  g, "Number of Ou
11c20 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61  tstanding Alloca
11c30 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25  tions:",.     "%
11c40 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
11c50 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11c60 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
11c70 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67  set);.  if( pArg
11c80 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
11c90 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b  FLG_Pagecache ){
11ca0 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
11cb0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
11cc0 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67  er of Pcache Pag
11cd0 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  es Used:",.     
11ce0 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11cf0 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54  d) pages", SQLIT
11d00 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11d10 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  HE_USED, bReset)
11d20 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53  ;.  }.  displayS
11d30 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11d40 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
11d50 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22  Overflow Bytes:"
11d60 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
11d70 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20  x %lld) bytes", 
11d80 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
11d90 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57  GECACHE_OVERFLOW
11da0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11db0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11dc0 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  g, "Largest Allo
11dd0 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22  cation:",.     "
11de0 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
11df0 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
11e00 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
11e10 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11e20 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
11e30 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74  t Pcache Allocat
11e40 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
11e50 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
11e60 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11e70 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  E_SIZE, bReset);
11e80 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d  .#ifdef YYTRACKM
11e90 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64  AXSTACKDEPTH.  d
11ea0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11eb0 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61  Arg, "Deepest Pa
11ec0 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20  rser Stack:",.  
11ed0 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11ee0 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ld)", SQLITE_STA
11ef0 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b  TUS_PARSER_STACK
11f00 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69  , bReset);.#endi
11f10 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  f..  if( db ){. 
11f20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
11f30 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
11f40 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
11f50 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11f60 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
11f70 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
11f80 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
11f90 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
11fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11fb0 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
11fc0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
11fd0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
11fe0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
12000 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
12010 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
12020 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
12030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12040 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
12050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12060 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12070 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12080 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
120b0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
120c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
120d0 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
120e0 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
120f0 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
12100 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12110 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
12120 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12130 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12140 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
12150 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12180 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12190 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
121a0 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
121b0 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
121c0 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
121d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
121e0 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
121f0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12200 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12210 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
12220 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12250 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12260 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12270 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12280 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
12290 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
122a0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
122b0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
122c0 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
122d0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
122e0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
122f0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12300 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
12310 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
12320 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
12330 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12340 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
12350 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
12370 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
12380 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
12390 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
123a0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
123b0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
123c0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
123d0 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
123e0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
123f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12400 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
12410 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12430 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12440 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
12450 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
12460 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12470 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
12480 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
12490 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
124a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
124b0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
124c0 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
124e0 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
124f0 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
12500 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
12510 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12520 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
12530 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
12540 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
12550 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12560 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
12570 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12590 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
125a0 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
125b0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
125c0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
125d0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
125e0 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75  ACHE_SPILL, &iCu
125f0 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12600 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12610 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
12620 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20  cache spills:   
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12650 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12660 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12670 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12680 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12690 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
126a0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
126b0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
126c0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
126d0 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
126e0 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
126f0 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
12700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
12710 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
12720 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
12730 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12740 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12750 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
12760 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
12770 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
12780 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12790 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
127a0 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
127b0 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
127c0 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
127d0 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
127e0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
127f0 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  mt ){.    iCur =
12800 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12810 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12820 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12830 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
12840 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P,.             
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72    bReset);.    r
12870 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12880 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53  out, "Fullscan S
12890 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
128a0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
128b0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
128c0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
128d0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
128e0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
128f0 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65  STATUS_SORT, bRe
12900 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12910 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12920 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73  "Sort Operations
12930 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12940 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12950 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12960 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12970 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12980 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12990 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73  S_AUTOINDEX,bRes
129a0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
129b0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
129c0 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74  Autoindex Insert
129d0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
129e0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
129f0 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12a00 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12a10 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12a20 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12a30 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74  _VM_STEP, bReset
12a40 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12a50 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69  f(pArg->out, "Vi
12a60 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74  rtual Machine St
12a70 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
12a80 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12a90 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12aa0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12ab0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12ac0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
12ad0 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65 74  EPREPARE, bReset
12ae0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12af0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65  f(pArg->out, "Re
12b00 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f  prepare operatio
12b10 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12b20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12b30 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12b40 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12b50 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12b60 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
12b70 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  UN, bReset);.   
12b80 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12b90 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
12ba0 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20  f times run:    
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12bc0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12bd0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12be0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12bf0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12c00 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44  MTSTATUS_MEMUSED
12c10 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12c20 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12c30 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65  out, "Memory use
12c40 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73 74  d by prepared st
12c50 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22  mt:        %d\n"
12c60 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69  , iCur);.  }..#i
12c70 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20  fdef __linux__. 
12c80 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
12c90 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b  tats(pArg->out);
12ca0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
12cb0 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73   not remove this
12cc0 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c   machine readabl
12cd0 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61  e comment: extra
12ce0 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65  -stats-output-he
12cf0 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  re */..  return 
12d00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  0;.}../*.** Disp
12d10 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a  lay scan stats..
12d20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
12d30 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
12d40 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12d70 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
12d80 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20  ellState *pArg  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12da0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
12db0 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66  lState */.){.#if
12dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
12dd0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
12de0 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  US.  UNUSED_PARA
12df0 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
12e00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41  SED_PARAMETER(pA
12e10 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  rg);.#else.  int
12e20 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20   i, k, n, mx;.  
12e30 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12e40 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
12e50 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d  scanstats ------
12e60 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30  --\n");.  mx = 0
12e70 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d  ;.  for(k=0; k<=
12e80 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f  mx; k++){.    do
12e90 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20  uble rEstLoop = 
12ea0 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  1.0;.    for(i=n
12eb0 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  =0; 1; i++){.   
12ec0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
12ed0 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  *p = pArg->pStmt
12ee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12ef0 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69  int64 nLoop, nVi
12f00 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  sit;.      doubl
12f10 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e  e rEst;.      in
12f20 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f  t iSid;.      co
12f30 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  nst char *zExpla
12f40 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  in;.      if( sq
12f50 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12f60 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12f70 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f  TE_SCANSTAT_NLOO
12f80 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70  P, (void*)&nLoop
12f90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
12fa0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
12fb0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
12fc0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12fd0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12fe0 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a  SELECTID, (void*
12ff0 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69  )&iSid);.      i
13000 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20  f( iSid>mx ) mx 
13010 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66  = iSid;.      if
13020 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74  ( iSid!=k ) cont
13030 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
13040 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
13050 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62  rEstLoop = (doub
13060 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  le)nLoop;.      
13070 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f    if( k>0 ) raw_
13080 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
13090 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71  , "-------- subq
130a0 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c  uery %d -------\
130b0 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  n", k);.      }.
130c0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
130d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
130e0 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
130f0 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
13100 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e  VISIT, (void*)&n
13110 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Visit);.      sq
13120 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
13130 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
13140 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c  TE_SCANSTAT_EST,
13150 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a   (void*)&rEst);.
13160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
13170 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
13180 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
13190 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f  TAT_EXPLAIN, (vo
131a0 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a  id*)&zExplain);.
131b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
131c0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
131d0 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e  op %2d: %s\n", n
131e0 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  , zExplain);.   
131f0 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72     rEstLoop *= r
13200 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  Est;.      raw_p
13210 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
13220 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
13230 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c       nLoop=%-8ll
13240 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  d nRow=%-8lld es
13250 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  tRow=%-8lld estR
13260 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c  ow/Loop=%-8g\n",
13270 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70  .          nLoop
13280 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74  , nVisit, (sqlit
13290 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f  e3_int64)(rEstLo
132a0 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20  op+0.5), rEst.  
132b0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
132c0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
132d0 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69  -----\n");.#endi
13300 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  f.}../*.** Param
13310 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69  eter azArray poi
13320 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65  nts to a zero-te
13330 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f  rminated array o
13340 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a  f strings. zStr.
13350 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  ** points to a s
13360 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ingle nul-termin
13370 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74  ated string. Ret
13380 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
13390 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c  zStr.** is equal
133a0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  , according to s
133b0 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20  trcmp(), to any 
133c0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69  of the strings i
133d0 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20  n the array..** 
133e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
133f0 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
13400 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72  c int str_in_arr
13410 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ay(const char *z
13420 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Str, const char 
13430 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e  **azArray){.  in
13440 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
13450 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29  azArray[i]; i++)
13460 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
13470 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61  cmp(zStr, azArra
13480 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31  y[i]) ) return 1
13490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
134a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f  ;.}../*.** If co
134b0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
134c0 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f   pSql appears to
134d0 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73   be an EXPLAIN s
134e0 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61  tatement, alloca
134f0 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  te.** and popula
13500 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  te the ShellStat
13510 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e.aiIndent[] arr
13520 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ay with the numb
13530 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20  er of.** spaces 
13540 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75  each opcode shou
13550 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
13560 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70  efore it is outp
13570 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ut..**.** The in
13580 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72  denting rules ar
13590 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46  e:.**.**     * F
135a0 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20  or each "Next", 
135b0 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20  "Prev", "VNext" 
135c0 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72  or "VPrev" instr
135d0 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a  uction, indent.*
135e0 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f  *       all opco
135f0 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  des that occur b
13600 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75  etween the p2 ju
13610 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  mp destination a
13620 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a  nd the opcode.**
13630 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79         itself by
13640 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a   2 spaces..**.**
13650 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20       * For each 
13660 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a  "Goto", if the j
13670 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
13680 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  is earlier in th
13690 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20  e program.**    
136a0 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f     and ends on o
136b0 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20  ne of:.**       
136c0 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74     Yield  SeekGt
136d0 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74    SeekLt  RowSet
136e0 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20  Read  Rewind.** 
136f0 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20        or if the 
13700 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  P1 parameter is 
13710 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a  one instead of z
13720 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ero,.**       th
13730 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70  en indent all op
13740 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68  codes between th
13750 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75  e earlier instru
13760 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61  ction.**       a
13770 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73  nd "Goto" by 2 s
13780 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
13790 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
137a0 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c  ta_prepare(Shell
137b0 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65  State *p, sqlite
137c0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20  3_stmt *pSql){. 
137d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
137e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
137f0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20   /* The text of 
13800 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
13810 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
13820 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
13830 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
13840 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  o check if this 
13850 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f  is an EXPLAIN */
13860 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20  .  int *abYield 
13870 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13880 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70     /* True if op
13890 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20   is an OP_Yield 
138a0 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
138b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
138c0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
138d0 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49  d size of p->aiI
138e0 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64  ndent[], abYield
138f0 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20   */.  int iOp;  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13920 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70  f operation in p
13930 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  ->aiIndent[] */.
13940 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
13950 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78  zNext[] = { "Nex
13960 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72  t", "Prev", "VPr
13970 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53  ev", "VNext", "S
13980 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b  orterNext", 0 };
13990 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
139a0 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69  zYield[] = { "Yi
139b0 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20  eld", "SeekLT", 
139c0 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65  "SeekGT", "RowSe
139d0 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20  tRead",.        
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20      "Rewind", 0 
13a00 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13a10 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47  *azGoto[] = { "G
13a20 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a  oto", 0 };..  /*
13a30 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f   Try to figure o
13a40 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72 65  ut if this is re
13a50 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20  ally an EXPLAIN 
13a60 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
13a70 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62  is.  ** cannot b
13a80 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74 75  e verified, retu
13a90 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20  rn early.  */.  
13aa0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
13ab0 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d  mn_count(pSql)!=
13ac0 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  8 ){.    p->cMod
13ad0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13ae0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
13af0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
13b00 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  l(pSql);.  if( z
13b10 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Sql==0 ) return;
13b20 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a  .  for(z=zSql; *
13b30 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  z==' ' || *z=='\
13b40 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c  t' || *z=='\n' |
13b50 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a  | *z=='\f' || *z
13b60 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20  =='\r'; z++);.  
13b70 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
13b80 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e  icmp(z, "explain
13b90 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 7) ){.    p->
13ba0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
13bb0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13bc0 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53  ..  for(iOp=0; S
13bd0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
13be0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69  e3_step(pSql); i
13bf0 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  Op++){.    int i
13c00 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72 20  ;.    int iAddr 
13c10 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
13c20 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  _int(pSql, 0);. 
13c30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13c40 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Op = (const char
13c50 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
13c60 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
13c70 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74  .    /* Set p2 t
13c80 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f  o the P2 field o
13c90 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70  f the current op
13ca0 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75  code. Then, assu
13cb0 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ming that.    **
13cc0 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75   p2 is an instru
13cd0 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73  ction address, s
13ce0 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70  et variable p2op
13cf0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
13d00 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73   that.    ** ins
13d10 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
13d20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
13d30 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61  . p2 and p2op ma
13d40 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 69  y be different i
13d50 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
13d60 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  rent instruction
13d70 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73 75   is part of a su
13d80 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61  b-program genera
13d90 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a  ted by an.    **
13da0 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20   SQL trigger or 
13db0 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f  foreign key.  */
13dc0 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71  .    int p2 = sq
13dd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13de0 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69  (pSql, 3);.    i
13df0 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20  nt p2op = (p2 + 
13e00 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20  (iOp-iAddr));.. 
13e10 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70     /* Grow the p
13e20 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79  ->aiIndent array
13e30 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   as required */.
13e40 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c      if( iOp>=nAl
13e50 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  loc ){.      if(
13e60 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20   iOp==0 ){.     
13e70 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72     /* Do further
13e80 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61   verfication tha
13e90 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61 69  t this is explai
13ea0 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74  n output.  Abort
13eb0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   if.        ** i
13ec0 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  t is not */.    
13ed0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13ee0 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f   char *explainCo
13ef0 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ls[] = {.       
13f00 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63      "addr", "opc
13f10 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22  ode", "p1", "p2"
13f20 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70  , "p3", "p4", "p
13f30 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b  5", "comment" };
13f40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  .        int jj;
13f50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
13f60 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28  0; jj<ArraySize(
13f70 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a  explainCols); jj
13f80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
13f90 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65  f( strcmp(sqlite
13fa0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
13fb0 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f  ql,jj),explainCo
13fc0 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  ls[jj])!=0 ){.  
13fd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f            p->cMo
13fe0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13ff0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14000 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20  3_reset(pSql);. 
14010 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
14020 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
14030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14040 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d  .      nAlloc +=
14050 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   100;.      p->a
14060 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29  iIndent = (int*)
14070 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
14080 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e  4(p->aiIndent, n
14090 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
140a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
140b0 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73  >aiIndent==0 ) s
140c0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
140d0 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69  ry();.      abYi
140e0 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  eld = (int*)sqli
140f0 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62  te3_realloc64(ab
14100 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69  Yield, nAlloc*si
14110 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
14120 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30    if( abYield==0
14130 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
14140 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
14150 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d      abYield[iOp]
14160 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28   = str_in_array(
14170 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20  zOp, azYield);. 
14180 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69     p->aiIndent[i
14190 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Op] = 0;.    p->
141a0 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b  nIndent = iOp+1;
141b0 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  ..    if( str_in
141c0 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65  _array(zOp, azNe
141d0 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  xt) ){.      for
141e0 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
141f0 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
14200 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
14210 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
14220 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f  rray(zOp, azGoto
14230 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e  ) && p2op<p->nIn
14240 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62  dent.     && (ab
14250 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73  Yield[p2op] || s
14260 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
14270 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20  t(pSql, 2)).    
14280 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
14290 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
142a0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
142b0 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 2;.    }.  }.
142c0 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
142d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
142e0 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71  e(abYield);.  sq
142f0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
14300 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
14310 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63   the array alloc
14320 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f  ated by explain_
14330 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a  data_prepare()..
14340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
14350 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65  xplain_data_dele
14360 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  te(ShellState *p
14370 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
14380 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a  e(p->aiIndent);.
14390 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
143a0 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20  0;.  p->nIndent 
143b0 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e  = 0;.  p->iInden
143c0 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
143d0 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74  Disable and rest
143e0 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65 20  ore .wheretrace 
143f0 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65  and .selecttrace
14400 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69   settings..*/.#i
14410 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14420 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
14430 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
14440 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78  _SELECTTRACE).ex
14450 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14460 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61  SelectTrace;.sta
14470 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c  tic int savedSel
14480 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
14490 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
144a0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
144b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
144c0 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
144d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
144e0 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74  e3WhereTrace;.st
144f0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57 68  atic int savedWh
14500 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ereTrace;.#endif
14510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
14520 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
14530 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
14540 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14550 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
14560 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
14570 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
14580 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
14590 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
145a0 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
145b0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b  SelectTrace = 0;
145c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
145d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
145e0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
145f0 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
14600 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57 68  TRACE).  savedWh
14610 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74  ereTrace = sqlit
14620 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
14630 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
14640 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  e = 0;.#endif.}.
14650 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74  static void rest
14660 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ore_debug_trace_
14670 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66  modes(void){.#if
14680 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14690 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
146a0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
146b0 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73  SELECTTRACE).  s
146c0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
146d0 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54  e = savedSelectT
146e0 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
146f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14700 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
14710 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
14720 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 71  WHERETRACE).  sq
14730 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
14740 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63  = savedWhereTrac
14750 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20  e;.#endif.}../* 
14760 43 72 65 61 74 65 20 74 68 65 20 54 45 4d 50 20  Create the TEMP 
14770 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 73 74  table used to st
14780 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20 62 69  ore parameter bi
14790 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74 69 63  ndings */.static
147a0 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62 6c 65   void bind_table
147b0 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61 74 65  _init(ShellState
147c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72 53 63   *p){.  int wrSc
147d0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71 6c 69  hema = 0;.  sqli
147e0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d  te3_db_config(p-
147f0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  >db, SQLITE_DBCO
14800 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43  NFIG_WRITABLE_SC
14810 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53 63 68  HEMA, -1, &wrSch
14820 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
14830 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
14840 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
14850 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
14860 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
14870 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
14880 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
14890 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
148a0 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d  emp.sqlite_param
148b0 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20 22 20  eters(\n".    " 
148c0 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52   key TEXT PRIMAR
148d0 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 22 20  Y KEY,\n".    " 
148e0 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a 20 20   value ANY\n".  
148f0 20 20 22 29 20 57 49 54 48 4f 55 54 20 52 4f 57    ") WITHOUT ROW
14900 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30 2c 20  ID;",.    0, 0, 
14910 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62  0);.  sqlite3_db
14920 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
14930 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
14940 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
14950 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a 7d 0a  wrSchema, 0);.}.
14960 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61 72 61  ./*.** Bind para
14970 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72 65 70  meters on a prep
14980 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
14990 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
149a0 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74 61 6b  bindings are tak
149b0 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50 20 74  en from a TEMP t
149c0 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  able of the form
149d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
149e0 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c  E TEMP TABLE sql
149f0 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28 6b  ite_parameters(k
14a00 65 79 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  ey TEXT PRIMARY 
14a10 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a 20 20  KEY, value).**  
14a20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b    WITHOUT ROWID;
14a30 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64 69 6e  .**.** No bindin
14a40 67 73 20 6f 63 63 75 72 20 69 66 20 74 68 69 73  gs occur if this
14a50 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
14a60 65 78 69 73 74 2e 20 20 54 68 65 20 73 70 65 63  exist.  The spec
14a70 69 61 6c 20 63 68 61 72 61 63 74 65 72 20 27 24  ial character '$
14a80 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65 64  '.** is included
14a90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61   in the table na
14aa0 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65 76 65  me to help preve
14ab0 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69  nt collisions wi
14ac0 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c 65 73  th actual tables
14ad0 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6d  ..** The table m
14ae0 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 54 45  ust be in the TE
14af0 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 73 74  MP schema..*/.st
14b00 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64 5f 70  atic void bind_p
14b10 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53 68 65  repared_stmt(She
14b20 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 73  llState *pArg, s
14b30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
14b40 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61 72 3b  mt){.  int nVar;
14b50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14b60 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
14b70 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20 20 6e  mt *pQ = 0;..  n
14b80 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
14b90 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
14ba0 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  nt(pStmt);.  if(
14bb0 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72   nVar==0 ) retur
14bc0 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20 74  n;  /* Nothing t
14bd0 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20 73 71  o do */.  if( sq
14be0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
14bf0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41 72 67  mn_metadata(pArg
14c00 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20 22 73  ->db, "TEMP", "s
14c10 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73  qlite_parameters
14c20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20 30 2c         "key", 0,
14c50 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d 53 51   0, 0, 0, 0)!=SQ
14c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14c70 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61 6d 65  eturn; /* Parame
14c80 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  ter table does n
14c90 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 7d 0a  ot exist */.  }.
14ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
14cb0 72 65 70 61 72 65 5f 76 32 28 70 41 72 67 2d 3e  repare_v2(pArg->
14cc0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  db,.          "S
14cd0 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
14ce0 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72   temp.sqlite_par
14cf0 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20 20 20  ameters".       
14d00 20 20 20 22 20 57 48 45 52 45 20 6b 65 79 3d 3f     " WHERE key=?
14d10 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30 29 3b  1", -1, &pQ, 0);
14d20 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70 51 3d  .  if( rc || pQ=
14d30 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14d40 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
14d50 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14d60 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 63 6f  zNum[30];.    co
14d70 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d  nst char *zVar =
14d80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
14d90 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
14da0 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  mt, i);.    if( 
14db0 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zVar==0 ){.     
14dc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14dd0 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2c 7a  f(sizeof(zNum),z
14de0 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a 20 20  Num,"?%d",i);.  
14df0 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75 6d 3b      zVar = zNum;
14e00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14e10 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 51 2c  e3_bind_text(pQ,
14e20 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20 53 51   1, zVar, -1, SQ
14e30 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
14e50 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(pQ)==SQLITE_R
14e60 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OW ){.      sqli
14e70 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
14e80 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74 65 33  Stmt, i, sqlite3
14e90 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 51  _column_value(pQ
14ea0 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , 0));.    }else
14eb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14ec0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
14ed0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   i);.    }.    s
14ee0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 51 29  qlite3_reset(pQ)
14ef0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14f00 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a 7d 0a  finalize(pQ);.}.
14f10 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
14f20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
14f30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
14f40 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
14f50 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
14f60 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14f90 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
14fa0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
14fb0 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20 20   *pStmt         
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
14fe0 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20   to run */.){.  
14ff0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
15000 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
15010 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
15020 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
15030 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
15040 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
15050 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
15060 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
15070 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
15080 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
15090 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
150a0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
150b0 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
150c0 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
150d0 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d  pace for col nam
150e0 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72  e ptr, value ptr
150f0 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20  , and type */.  
15100 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
15110 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
15120 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76 6f  t(pStmt);.    vo
15130 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
15140 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
15150 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
15160 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
15170 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
15180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15190 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
151a0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
151b0 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
151c0 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
151d0 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
151e0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
151f0 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
15200 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
15210 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
15220 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
15230 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20  *aiTypes = (int 
15240 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b  *)&azVals[nCol];
15250 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73   /* Result types
15260 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   */.      int i,
15270 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   x;.      assert
15280 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
15290 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
152a0 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f  .      /* save o
152b0 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
152c0 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
152d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
152e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
152f0 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
15300 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
15310 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
15320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15330 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   do{.        /* 
15340 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74 61  extract the data
15350 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73 20   and data types 
15360 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
15370 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15380 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54 79  {.          aiTy
15390 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
153a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
153b0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
153c0 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
153d0 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
153e0 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
153f0 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
15400 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
15410 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20  ls[i] = "";.    
15420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15430 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
15440 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
15450 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
15460 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
15470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15480 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20   if( !azVals[i] 
15490 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d  && (aiTypes[i]!=
154a0 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
154b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
154c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
154d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
154e0 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
154f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15500 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f       } /* end fo
15510 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r */..        /*
15520 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
15530 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
15540 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
15550 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
15560 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
15570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
15580 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
15590 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
155a0 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
155b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
155c0 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  ( shell_callback
155d0 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
155e0 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
155f0 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
15600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15610 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
15620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15640 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
15650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15660 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68 69     }.      } whi
15670 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
15680 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  = rc );.      sq
15690 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
156a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
156b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
156c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
156d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
156e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
156f0 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
15700 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
15710 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
15720 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
15730 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
15740 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
15750 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
15760 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
15770 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
15780 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
15790 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
157a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
157b0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
157c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
157d0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
157e0 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
157f0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15800 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15810 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15820 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
15830 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
15840 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15850 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
15860 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15870 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
15880 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
15890 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
158a0 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
158b0 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
158c0 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
158d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
158e0 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
158f0 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
15900 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15910 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
15920 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
15930 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
15940 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
15950 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
15960 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
15970 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
15980 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15990 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
159a0 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
159b0 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
159c0 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
159d0 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
159e0 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
159f0 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
15a00 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
15a10 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
15a20 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
15a30 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
15a40 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
15a50 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
15a60 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15a70 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
15a80 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
15a90 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
15aa0 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
15ab0 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
15ac0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15ad0 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
15ae0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
15af0 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
15b00 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15b10 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
15b20 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15b30 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
15b40 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
15b50 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
15b60 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
15b70 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
15b80 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
15b90 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
15ba0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15bc0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
15bd0 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
15be0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
15bf0 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
15c00 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
15c10 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
15c20 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
15c30 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
15c40 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
15c50 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
15c60 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
15c70 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
15c80 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
15c90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
15ca0 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
15cb0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
15cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15cd0 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
15ce0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
15cf0 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
15d00 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
15d10 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
15d20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15d30 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
15d40 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
15d50 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
15d60 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
15d70 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15d80 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
15d90 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15db0 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
15dc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15dd0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
15de0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
15e00 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
15e10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15e20 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
15e30 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
15e40 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
15e50 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
15e60 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
15e70 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15e80 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15e90 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
15ea0 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
15eb0 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
15ec0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15ed0 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15ee0 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
15ef0 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
15f00 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
15f10 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
15f20 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
15f30 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
15f40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15f50 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
15f60 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
15f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f80 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
15f90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15fa0 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
15fb0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
15fc0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15fd0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15fe0 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
15ff0 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
16000 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
16010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16020 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
16030 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
16040 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16050 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
16060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16070 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
16080 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
16090 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
160a0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
160b0 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
160c0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160e0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
160f0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
16100 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16120 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
16130 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
16140 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
16150 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16170 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
16180 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
16190 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
161a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
161b0 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
161c0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
161d0 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
161e0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
161f0 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
16200 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
16210 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
16220 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
16230 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
16240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16250 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
16260 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
16270 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
16280 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
16290 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
162a0 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
162b0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
162c0 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
162d0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
162e0 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
162f0 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
16300 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
16310 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
16320 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
16330 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
16340 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
16350 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
16360 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
16370 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
16380 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
16390 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
163a0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
163b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
163c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
163d0 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
163e0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
163f0 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
16400 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
16410 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
16420 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
16430 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
16440 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
16450 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
16460 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
16470 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16480 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16490 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
164a0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
164b0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
164c0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
164d0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
164e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
164f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
16500 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
16510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
16520 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16530 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
16540 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
16550 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
16560 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
16570 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
16580 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
16590 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
165a0 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
165b0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
165c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
165d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
165e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
165f0 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
16600 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
16610 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16620 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
16630 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
16640 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
16650 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
16660 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
16670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16680 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
16690 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
166a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
166b0 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
166c0 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
166d0 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
166e0 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
166f0 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
16700 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
16710 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
16720 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
16730 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
16740 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
16750 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
16760 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
16770 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
16780 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
16790 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
167a0 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
167b0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
167c0 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
167d0 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xec(.  ShellStat
167e0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
16810 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63  hellState */.  c
16820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
16850 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
16860 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
16870 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16890 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
168a0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
168b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
168c0 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
168d0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
168e0 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
168f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16900 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
16910 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
16920 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
16930 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
16940 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
16950 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
16960 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73 71  ssed SQL */.  sq
16970 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72 67  lite3 *db = pArg
16980 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a 45  ->db;..  if( pzE
16990 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
169a0 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
169b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
169c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
169d0 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67 2d  ABLE.  if( pArg-
169e0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
169f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 65  ){.    rc = expe
16a00 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72 67  rtHandleSQL(pArg
16a10 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67  , zSql, pzErrMsg
16a20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  );.    return ex
16a30 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67 2c  pertFinish(pArg,
16a40 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc!=SQLITE_OK)
16a50 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , pzErrMsg);.  }
16a60 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
16a70 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
16a80 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
16a90 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
16aa0 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
16ab0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
16ac0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
16ad0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
16ae0 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
16af0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
16b00 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
16b10 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
16b20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16b30 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16b40 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16b60 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
16b70 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
16b80 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
16b90 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
16ba0 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
16bb0 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
16bc0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
16bd0 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
16be0 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
16bf0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16c00 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
16c10 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
16c20 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
16c30 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
16c40 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
16c50 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
16c60 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
16c70 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
16c80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
16c90 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
16ca0 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
16cb0 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
16cc0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
16cd0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16ce0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16cf0 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
16d00 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
16d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16d20 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
16d30 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
16d40 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
16d50 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
16d60 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
16d70 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
16d80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
16d90 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
16da0 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
16db0 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
16dc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16dd0 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
16de0 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
16df0 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
16e00 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
16e10 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
16e20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
16e30 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 30  xplain(pStmt)==0
16e40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16e50 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
16e60 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
16e70 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
16e80 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d  int triggerEQP =
16e90 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61   0;.        disa
16ea0 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ble_debug_trace_
16eb0 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20  modes();.       
16ec0 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16ed0 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16ee0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16ef0 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72  QP, -1, &trigger
16f00 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
16f10 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
16f20 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
16f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16f40 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
16f50 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
16f60 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
16f70 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
16f80 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d  }.        zEQP =
16f90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16fa0 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
16fb0 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53  PLAN %s", zStmtS
16fc0 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ql);.        rc 
16fd0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
16fe0 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
16ff0 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
17000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17020 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
17030 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
17040 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52  plain)==SQLITE_R
17050 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
17060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
17070 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20  QPLine = (const 
17080 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
17090 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
170a0 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 20  in,3);.         
170b0 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d 20     int iEqpId = 
170c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
170d0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  nt(pExplain, 0);
170e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
170f0 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71 6c   iParentId = sql
17100 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17110 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
17120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 45            if( zE
17130 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29  QPLine[0]=='-' )
17140 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
17150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
17160 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c 20  qp_append(pArg, 
17170 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74 49  iEqpId, iParentI
17180 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20  d, zEQPLine);.  
17190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
171a0 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70      eqp_render(p
171b0 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
171c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
171d0 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
171e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
171f0 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
17200 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
17210 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17220 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20  QP_full ){.     
17230 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20       /* Also do 
17240 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22  an EXPLAIN for "
17250 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20  .eqp full" mode 
17260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51  */.          zEQ
17270 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
17280 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22  ntf("EXPLAIN %s"
17290 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
172a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
172b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
172c0 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
172d0 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
172e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
172f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17300 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17310 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
17320 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  n;.            e
17330 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
17340 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61  are(pArg, pExpla
17350 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
17360 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
17370 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61  tmt(pArg, pExpla
17380 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
17390 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
173a0 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20  lete(pArg);.    
173b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
173c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
173d0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
173e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
173f0 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
17400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17410 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
17420 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
17430 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d 3d   && triggerEQP==
17440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
17450 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
17460 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
17470 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
17480 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
17490 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20     /* Reprepare 
174a0 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65 61  pStmt before rea
174b0 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d 6f  ctiving trace mo
174c0 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  des */.         
174d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
174e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
174f0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
17500 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
17510 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
17520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17530 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74 6d  Arg ) pArg->pStm
17540 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
17550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73     }.        res
17560 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
17570 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
17580 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
17590 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
175a0 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
175b0 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
175c0 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
175d0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
175e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
175f0 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17600 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  mt)==1 ){.      
17610 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17620 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
17630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17640 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
17650 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
17660 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b 0a  in(pStmt)==2 ){.
17670 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
17680 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
17690 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  QP;.          }.
176a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
176b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65     /* If the she
176c0 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ll is currently 
176d0 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  in ".explain" mo
176e0 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65  de, gather the e
176f0 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  xtra.        ** 
17700 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
17710 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
17720 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
17730 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
17740 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
17750 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
17760 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
17770 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d  epare(pArg, pStm
17780 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
17790 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69 6e      }..      bin
177a0 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  d_prepared_stmt(
177b0 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
177c0 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
177d0 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74  d_stmt(pArg, pSt
177e0 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mt);.      expla
177f0 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17800 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  Arg);.      eqp_
17810 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20  render(pArg);.. 
17820 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
17830 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
17840 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
17850 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
17860 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
17870 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
17880 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
17890 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
178a0 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75  * print loop-cou
178b0 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65  nters if require
178c0 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
178d0 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61  Arg && pArg->sca
178e0 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  nstatsOn ){.    
178f0 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e      display_scan
17900 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b  stats(db, pArg);
17910 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17920 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
17930 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65  statement just e
17940 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73  xecuted. If this
17950 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20   fails, save a. 
17960 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
17970 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
17980 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  e. Otherwise, se
17990 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20  t zSql to point 
179a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
179b0 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
179c0 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
179d0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
179e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
179f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17a00 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
17a10 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
17a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  K ){.        zSq
17a40 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20  l = zLeftover;. 
17a50 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
17a60 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29  Space(zSql[0]) )
17a70 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d   zSql++;.      }
17a80 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73  else if( pzErrMs
17a90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
17aa0 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
17ab0 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
17ac0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65   }..      /* cle
17ad0 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61  ar saved stmt ha
17ae0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndle */.      if
17af0 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
17b00 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
17b10 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
17b20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77    }.  } /* end w
17b30 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  hile */..  retur
17b40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17b50 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72  elease memory pr
17b60 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
17b70 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d  ed by tableColum
17b80 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  nList()..*/.stat
17b90 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75  ic void freeColu
17ba0 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a  mnList(char **az
17bb0 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
17bc0 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
17bd0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  i]; i++){.    sq
17be0 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
17bf0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61  [i]);.  }.  /* a
17c00 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61  zCol[0] is a sta
17c10 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  tic string */.  
17c20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17c30 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ol);.}../*.** Re
17c40 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  turn a list of p
17c50 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e  ointers to strin
17c60 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  gs which are the
17c70 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a   names of all.**
17c80 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
17c90 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65  e zTab.   The me
17ca0 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
17cb0 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69   names is dynami
17cc0 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
17cd0 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  ed and must be r
17ce0 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63  eleased by the c
17cf0 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75  aller using a su
17d00 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
17d10 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69   to freeColumnLi
17d20 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  st()..**.** The 
17d30 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69  azCol[0] entry i
17d40 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20  s usually NULL. 
17d50 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61   However, if zTa
17d60 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77  b contains a row
17d70 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74  id.** value that
17d80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
17d90 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43  served, then azC
17da0 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20  ol[0] is filled 
17db0 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  in with the.** n
17dc0 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ame of the rowid
17dd0 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54   column..**.** T
17de0 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72  he first regular
17df0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
17e00 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d  able is azCol[1]
17e10 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
17e20 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20  erminated.** by 
17e30 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a  an entry with az
17e40 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74  Col[i]==0..*/.st
17e50 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c  atic char **tabl
17e60 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c  eColumnList(Shel
17e70 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
17e80 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
17e90 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
17ea0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17eb0 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *pStmt;.  char 
17ec0 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f  *zSql;.  int nCo
17ed0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c  l = 0;.  int nAl
17ee0 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  loc = 0;.  int n
17ef0 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  PK = 0;       /*
17f00 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
17f10 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73  RY KEY columns s
17f20 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  een */.  int isI
17f30 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  PK = 0;     /* T
17f40 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41  rue if one PRIMA
17f50 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66  RY KEY column of
17f60 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f   type INTEGER */
17f70 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52  .  int preserveR
17f80 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46  owid = ShellHasF
17f90 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65  lag(p, SHFLG_Pre
17fa0 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69  serveRowid);.  i
17fb0 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  nt rc;..  zSql =
17fc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17fd0 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
17fe0 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a  nfo=%Q", zTab);.
17ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
18000 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
18010 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
18020 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
18030 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
18040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30  f( rc ) return 0
18050 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
18060 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
18070 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
18080 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c    if( nCol>=nAll
18090 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41  oc-2 ){.      nA
180a0 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20  lloc = nAlloc*2 
180b0 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20  + nCol + 10;.   
180c0 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74     azCol = sqlit
180d0 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c  e3_realloc(azCol
180e0 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
180f0 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  azCol[0]));.    
18100 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
18110 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
18120 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
18130 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20    azCol[++nCol] 
18140 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18150 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
18160 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
18170 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20  t, 1));.    if( 
18180 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18190 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a  nt(pStmt, 5) ){.
181a0 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20        nPK++;.   
181b0 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20     if( nPK==1.  
181c0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
181d0 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63  stricmp((const c
181e0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
181f0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
18200 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
18220 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
18230 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50   ){.        isIP
18240 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  K = 1;.      }el
18250 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50  se{.        isIP
18260 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  K = 0;.      }. 
18270 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18280 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
18290 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  t);.  if( azCol=
182a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
182b0 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20   azCol[0] = 0;. 
182c0 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d   azCol[nCol+1] =
182d0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65   0;..  /* The de
182e0 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65  cision of whethe
182f0 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64  r or not a rowid
18300 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f   really needs to
18310 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20   be preserved.  
18320 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57  ** is tricky.  W
18330 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  e never need to 
18340 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64  preserve a rowid
18350 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
18360 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20  OWID table.  ** 
18370 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
18380 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
18390 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20  RY KEY.  We are 
183a0 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72  unable to preser
183b0 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f  ve.  ** rowids o
183c0 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74  n tables where t
183d0 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63  he rowid is inac
183e0 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65  cessible because
183f0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
18400 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  .  ** columns in
18410 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
18420 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
18430 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a  d_", and "oid"..
18440 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65    */.  if( prese
18450 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50  rveRowid && isIP
18460 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
18470 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20   single PRIMARY 
18480 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  KEY column with 
18490 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73  type INTEGER was
184a0 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20   seen, then it. 
184b0 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61     ** might be a
184c0 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20  n alise for the 
184d0 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d  ROWID.  But it m
184e0 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57  ight also be a W
184f0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
18500 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49   ** table or a I
18510 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18520 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20  EY DESC column, 
18530 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
18540 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   are.    ** ROWI
18550 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64  D aliases.  To d
18560 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65  istinguish these
18570 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f   cases, check to
18580 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
18590 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65  here is a "pk" e
185a0 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20  ntry in "PRAGMA 
185b0 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68  index_list".  Th
185c0 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ere will be.    
185d0 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78  ** no "pk" index
185e0 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   if the PRIMARY 
185f0 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  KEY really is an
18600 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
18610 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  OWID..    */.   
18620 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
18630 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
18640 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e  1 FROM pragma_in
18650 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20  dex_list(%Q)".  
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
18680 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a   origin='pk'", z
18690 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Tab);.    rc = s
186a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
186b0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
186c0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
186d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
186e0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
186f0 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43  c ){.      freeC
18700 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
18710 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
18720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18730 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
18740 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
18750 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
18760 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52  );.    preserveR
18770 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54  owid = rc==SQLIT
18780 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  E_ROW;.  }.  if(
18790 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29   preserveRowid )
187a0 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72  {.    /* Only pr
187b0 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64  eserve the rowid
187c0 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20   if we can find 
187d0 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f  a name to use fo
187e0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77  r the.    ** row
187f0 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  id */.    static
18800 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d   char *azRowid[]
18810 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f   = { "rowid", "_
18820 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d  rowid_", "oid" }
18830 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
18840 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
18850 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
18860 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=1; i<=nCol; 
18870 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
18880 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
18890 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43  p(azRowid[j],azC
188a0 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  ol[i])==0 ) brea
188b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
188c0 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20   if( i>nCol ){. 
188d0 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
188e0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
188f0 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d   that azRowid[j]
18900 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
18910 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20   of any.        
18920 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  ** ordinary colu
18930 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  mn in the table.
18940 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a    Verify that az
18950 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61  Rowid[j] is a va
18960 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  lid.        ** n
18970 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  ame for the rowi
18980 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20  d before adding 
18990 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20  it to azCol[0]. 
189a0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
189b0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
189c0 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20   will fail this 
189d0 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20  last check */.  
189e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
189f0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
18a00 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30  metadata(p->db,0
18a10 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d  ,zTab,azRowid[j]
18a20 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
18a30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18a40 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30  ITE_OK ) azCol[0
18a50 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a  ] = azRowid[j];.
18a60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18a80 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b  .  return azCol;
18a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65  .}../*.** Toggle
18aa0 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f   the reverse_uno
18ab0 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73  rdered_selects s
18ac0 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  etting..*/.stati
18ad0 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c  c void toggleSel
18ae0 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33  ectOrder(sqlite3
18af0 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   *db){.  sqlite3
18b00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18b10 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67  ;.  int iSetting
18b20 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74   = 0;.  char zSt
18b30 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  mt[100];.  sqlit
18b40 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
18b50 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73  , "PRAGMA revers
18b60 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
18b70 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  cts", -1, &pStmt
18b80 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
18b90 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
18ba0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
18bb0 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71     iSetting = sq
18bc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18bd0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
18be0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
18bf0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
18c00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
18c10 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74  zeof(zStmt), zSt
18c20 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47  mt,.       "PRAG
18c30 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
18c40 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29  ered_selects(%d)
18c50 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20  ", !iSetting);. 
18c60 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
18c70 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30  , zStmt, 0, 0, 0
18c80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
18c90 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20   is a different 
18ca0 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
18cb0 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e   used for dumpin
18cc0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
18cd0 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65  ** Each row rece
18ce0 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c  ived by this cal
18cf0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
18d00 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  f a table name,.
18d10 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70  ** the table typ
18d20 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74  e ("index" or "t
18d30 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74  able") and SQL t
18d40 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
18d50 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  le..** This rout
18d60 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74  ine should print
18d70 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74   text sufficient
18d80 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
18d90 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
18da0 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62  c int dump_callb
18db0 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
18dc0 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
18dd0 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
18de0 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74  zNotUsed){.  int
18df0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
18e00 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  r *zTable;.  con
18e10 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
18e20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
18e30 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ql;.  ShellState
18e40 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
18e50 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  e *)pArg;..  UNU
18e60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
18e70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
18e80 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67  nArg!=3 || azArg
18e90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18ea0 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
18eb0 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
18ec0 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
18ed0 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69  = azArg[2];..  i
18ee0 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
18ef0 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
18f00 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ce")==0 ){.    r
18f10 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18f20 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
18f30 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
18f40 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
18f50 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
18f60 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c  ("sqlite_stat?",
18f70 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20   zTable)==0 ){. 
18f80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
18f90 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
18fa0 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
18fb0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
18fc0 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
18fd0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
18fe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18ff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
19000 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
19010 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
19020 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
19030 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
19040 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
19050 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
19060 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
19070 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
19080 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
19090 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
190a0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
190b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
190c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
190d0 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
190e0 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
190f0 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
19100 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
19110 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
19120 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
19130 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
19140 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
19150 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
19160 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
19170 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
19180 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
19190 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
191a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
191b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
191c0 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
191d0 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29  ut, zSql, ";\n")
191e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72  ;.  }..  if( str
191f0 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
19200 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68  e")==0 ){.    Sh
19210 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b  ellText sSelect;
19220 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
19230 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  Table;.    char 
19240 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  **azCol;.    int
19250 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61   i;.    char *sa
19260 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
19270 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b    int savedMode;
19280 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61  ..    azCol = ta
19290 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c  bleColumnList(p,
192a0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
192b0 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  ( azCol==0 ){.  
192c0 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
192d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
192e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77     }..    /* Alw
192f0 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
19300 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
19310 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
19320 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
19330 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
19340 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
19350 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
19360 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
19370 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61     initText(&sTa
19380 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ble);.    append
19390 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54  Text(&sTable, zT
193a0 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
193b0 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a  zTable));.    /*
193c0 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74   If preserving t
193d0 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20  he rowid, add a 
193e0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65  column list afte
193f0 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  r the table name
19400 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  ..    ** In othe
19410 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52  r words:  "INSER
19420 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64  T INTO tab(rowid
19430 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55  ,a,b,c,...) VALU
19440 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ES(...)".    ** 
19450 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
19460 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  sual "INSERT INT
19470 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e  O tab VALUES(...
19480 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  )"..    */.    i
19490 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
194a0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
194b0 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29  &sTable, "(", 0)
194c0 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
194d0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
194e0 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
194f0 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
19500 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
19510 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
19520 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ble, ",", 0);.  
19530 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19540 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
19550 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
19560 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
19570 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
19580 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c  xt(&sTable, ")",
19590 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
195a0 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72  /* Build an appr
195b0 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73  opriate SELECT s
195c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
195d0 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
195e0 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
195f0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
19600 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20  LECT ", 0);.    
19610 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
19620 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19630 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
19640 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  [0], 0);.      a
19650 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
19660 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
19670 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20   }.    for(i=1; 
19680 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
19690 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
196a0 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
196b0 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
196c0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
196d0 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20   if( azCol[i+1] 
196e0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
196f0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
19700 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ",", 0);.      }
19710 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43  .    }.    freeC
19720 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
19730 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
19740 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
19750 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
19760 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
19770 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
19780 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
19790 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c     savedDestTabl
197a0 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  e = p->zDestTabl
197b0 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65  e;.    savedMode
197c0 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
197d0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
197e0 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d  sTable.z;.    p-
197f0 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65  >mode = p->cMode
19800 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
19810 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
19820 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a  xec(p, sSelect.z
19830 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
19840 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
19850 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
19860 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
19870 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
19880 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
19890 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
198a0 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
198b0 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
198c0 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
198d0 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20  sSelect.z, 0);. 
198e0 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63       toggleSelec
198f0 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20  tOrder(p->db);. 
19900 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73     }.    p->zDes
19910 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65  tTable = savedDe
19920 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e  stTable;.    p->
19930 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65  mode = savedMode
19940 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
19950 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65  sTable);.    fre
19960 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
19970 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d  .    if( rc ) p-
19980 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
19990 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
199a0 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
199b0 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
199c0 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
199d0 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
199e0 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
199f0 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
19a00 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
19a10 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
19a20 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
19a30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
19a40 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
19a50 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
19a60 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
19a70 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
19a80 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
19a90 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
19aa0 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
19ab0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
19ac0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19ad0 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
19ae0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
19af0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
19b00 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
19b10 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
19b20 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19b30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19b40 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
19b50 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
19b60 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
19b70 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
19b80 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
19b90 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
19ba0 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
19bb0 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
19bc0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
19bd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
19be0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25  >out, "/****** %
19bf0 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
19c00 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
19c10 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
19c20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20       zErr = 0;. 
19c30 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d     }.    zQ2 = m
19c40 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
19c50 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
19c60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19c70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
19c80 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c  tf(len+100, zQ2,
19c90 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
19ca0 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
19cb0 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
19cc0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19cd0 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
19ce0 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
19cf0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19d00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19d10 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19d20 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
19d30 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
19d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19d50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
19d60 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
19d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
19d80 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
19d90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
19db0 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73  of help messages
19dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70  ..**.** The help
19dd0 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69   text for each i
19de0 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e  ndividual comman
19df0 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  d begins with a 
19e00 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73  line that starts
19e10 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53  .** with ".".  S
19e20 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20  ubsequent lines 
19e30 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c  are supplimental
19e40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
19e50 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
19e60 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70  e two or more sp
19e70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  aces between the
19e80 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d   end of the comm
19e90 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73  and and the.** s
19ea0 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63  tart of the desc
19eb0 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20  ription of what 
19ec0 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65  that command doe
19ed0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
19ee0 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70  st char *(azHelp
19ef0 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69  []) = {.#if defi
19f00 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
19f10 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65  ZLIB) && !define
19f20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
19f30 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e  RTUALTABLE).  ".
19f40 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20  archive ...     
19f50 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
19f60 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20  QL archives",.  
19f70 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64  "   Each command
19f80 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
19f90 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ly one of the fo
19fa0 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a  llowing options:
19fb0 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d  ",.  "     -c, -
19fc0 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
19fd0 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
19fe0 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  ew archive",.  "
19ff0 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74       -u, --updat
1a000 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a010 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70 64  Add files or upd
1a020 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20 63  ate files with c
1a030 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c 0a 20  hanged mtime",. 
1a040 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e 73   "     -i, --ins
1a050 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ert             
1a060 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20 61 6c    Like -u but al
1a070 77 61 79 73 20 61 64 64 20 65 76 65 6e 20 69 66  ways add even if
1a080 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67 65 64   mtime unchanged
1a090 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20 2d  ",.  "     -t, -
1a0a0 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  -list           
1a0b0 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65        List conte
1a0c0 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 22 2c  nts of archive",
1a0d0 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d 65  .  "     -x, --e
1a0e0 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20 20  xtract          
1a0f0 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c 65      Extract file
1a100 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22 2c  s from archive",
1a110 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c 20  .  "   Optional 
1a120 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20 22  arguments:",.  "
1a130 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f       -v, --verbo
1a140 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1a150 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e  Print each filen
1a160 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72 6f  ame as it is pro
1a170 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20 20  cessed",.  "    
1a180 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65   -f FILE, --file
1a190 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72   FILE       Oper
1a1a0 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46  ate on archive F
1a1b0 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73 20  ILE (default is 
1a1c0 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20 20  current db)",.  
1a1d0 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20 2d  "     -a FILE, -
1a1e0 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20  -append FILE    
1a1f0 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45   Operate on FILE
1a200 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
1a210 65 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c 0a  e apndvfs VFS",.
1a220 20 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c 20    "     -C DIR, 
1a230 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52 20  --directory DIR 
1a240 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72     Change to dir
1a250 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65  ectory DIR to re
1a260 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73  ad/extract files
1a270 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20 2d  ",.  "     -n, -
1a280 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20 20  -dryrun         
1a290 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 53        Show the S
1a2a0 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61  QL that would ha
1a2b0 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20 20  ve occurred",.  
1a2c0 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c 0a  "   Examples:",.
1a2d0 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66 20    "     .ar -cf 
1a2e0 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20  archive.sar foo 
1a2f0 62 61 72 20 20 23 20 43 72 65 61 74 65 20 61 72  bar  # Create ar
1a300 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66  chive.sar from f
1a310 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72  iles foo and bar
1a320 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
1a330 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  tf archive.sar  
1a340 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d          # List m
1a350 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69 76  embers of archiv
1a360 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20 20  e.sar",.  "     
1a370 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65  .ar -xvf archive
1a380 2e 73 61 72 20 20 20 20 20 20 20 20 20 23 20 56  .sar         # V
1a390 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74  erbosely extract
1a3a0 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
1a3b0 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20  ive.sar",.  "   
1a3c0 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22 20  See also:",.  " 
1a3d0 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c 69       http://sqli
1a3e0 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23  te.org/cli.html#
1a3f0 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73 75  sqlar_archive_su
1a400 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a 23  pport",.#endif.#
1a410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a420 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1a430 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46  .  ".auth ON|OFF
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1a450 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c  w authorizer cal
1a460 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66 0a  lbacks",.#endif.
1a470 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
1a480 46 49 4c 45 20 20 20 20 20 20 20 20 42 61 63 6b  FILE        Back
1a490 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  up DB (default \
1a4a0 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45  "main\") to FILE
1a4b0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61  ",.  "       --a
1a4c0 70 70 65 6e 64 20 20 20 20 20 20 20 20 20 20 20  ppend           
1a4d0 20 55 73 65 20 74 68 65 20 61 70 70 65 6e 64 76   Use the appendv
1a4e0 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  fs",.  "       -
1a4f0 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20 20 20  -async          
1a500 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c 45     Write to FILE
1a510 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75 72 6e   without a journ
1a520 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74 20 66  al and without f
1a530 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61 69  sync()",.  ".bai
1a540 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
1a550 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
1a560 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
1a570 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c  .  Default OFF",
1a580 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  .  ".binary on|o
1a590 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75 72  ff           Tur
1a5a0 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
1a5b0 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
1a5c0 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63 64  ult OFF",.  ".cd
1a5d0 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
1a5e0 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65        Change the
1a5f0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
1a600 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 22  ry to DIRECTORY"
1a610 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ,.  ".changes on
1a620 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53 68  |off          Sh
1a630 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ow number of row
1a640 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c  s changed by SQL
1a650 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f  ",.  ".check GLO
1a660 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  B              F
1a670 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69  ail if output si
1a680 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f  nce .testcase do
1a690 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a 20  es not match",. 
1a6a0 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20   ".clone NEWDB  
1a6b0 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e 65             Clone
1a6c0 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44 42   data into NEWDB
1a6d0 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69   from the existi
1a6e0 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
1a6f0 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20 20  ".databases     
1a700 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e            List n
1a710 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20 6f  ames and files o
1a720 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
1a730 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f 6e  ases",.  ".dbcon
1a740 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20 20  fig ?op? ?val?  
1a750 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e 67     List or chang
1a760 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  e sqlite3_db_con
1a770 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c 0a  fig() options",.
1a780 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
1a790 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1a7a0 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
1a7b0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
1a7c0 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75 6d  tabase",.  ".dum
1a7d0 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
1a7e0 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c 20       Render all 
1a7f0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
1a800 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20 20   as SQL",.  "   
1a810 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1a820 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f     --preserve-ro
1a830 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75 64  wids      Includ
1a840 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20 69  e ROWID values i
1a850 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a 20  n the output",. 
1a860 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e 65   "     --newline
1a870 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41 6c  s             Al
1a880 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e 65  low unescaped ne
1a890 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72 73  wline characters
1a8a0 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20 22   in output",.  "
1a8b0 20 20 20 54 41 42 4c 45 20 69 73 20 61 20 4c 49     TABLE is a LI
1a8c0 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74  KE pattern for t
1a8d0 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75 6d  he tables to dum
1a8e0 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c  p",.  ".echo on|
1a8f0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
1a900 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68  Turn command ech
1a910 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  o on or off",.  
1a920 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c  ".eqp on|off|ful
1a930 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c 65  l|...     Enable
1a940 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f   or disable auto
1a950 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55  matic EXPLAIN QU
1a960 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20 20  ERY PLAN",.  "  
1a970 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c 0a   Other Modes:",.
1a980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a990 42 55 47 0a 20 20 22 20 20 20 20 20 20 74 65 73  BUG.  "      tes
1a9a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a9b0 20 20 20 53 68 6f 77 20 72 61 77 20 45 58 50 4c     Show raw EXPL
1a9c0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f  AIN QUERY PLAN o
1a9d0 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20  utput",.  "     
1a9e0 20 74 72 61 63 65 20 20 20 20 20 20 20 20 20 20   trace          
1a9f0 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75         Like \"fu
1aa00 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 65 6e  ll\" but also en
1aa10 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20 76 64  able \"PRAGMA vd
1aa20 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65 6e  be_trace\"",.#en
1aa30 64 69 66 0a 20 20 22 20 20 20 20 20 20 74 72 69  dif.  "      tri
1aa40 67 67 65 72 20 20 20 20 20 20 20 20 20 20 20 20  gger            
1aa50 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22     Like \"full\"
1aa60 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77 20 74   but also show t
1aa70 72 69 67 67 65 72 20 62 79 74 65 63 6f 64 65 22  rigger bytecode"
1aa80 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20  ,.  ".excel     
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69                Di
1aaa0 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74  splay the output
1aab0 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64   of next command
1aac0 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65   in a spreadshee
1aad0 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f  t",.  ".exit ?CO
1aae0 44 45 3f 20 20 20 20 20 20 20 20 20 20 20 20 20  DE?             
1aaf0 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
1ab00 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f  m with return-co
1ab10 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78  de CODE",.  ".ex
1ab20 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  pert            
1ab30 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54        EXPERIMENT
1ab40 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65  AL. Suggest inde
1ab50 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69 65  xes for specifie
1ab60 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42  d queries",./* B
1ab70 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d  ecause explain m
1ab80 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74  ode comes on aut
1ab90 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20  omatically now, 
1aba0 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d  the ".explain" m
1abb0 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65  ode.** is remove
1abc0 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20  d from the help 
1abd0 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73  screen.  It is s
1abe0 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66  till supported f
1abf0 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76  or legacy, howev
1ac00 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69  er */./*".explai
1ac10 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20  n ?on|off|auto? 
1ac20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f    Turn EXPLAIN o
1ac30 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72  utput mode on or
1ac40 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d   off or to autom
1ac50 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c  atic",*/.  ".ful
1ac60 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
1ac70 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61  t?   Show schema
1ac80 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
1ac90 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20   of sqlite_stat 
1aca0 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61  tables",.  ".hea
1acb0 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  ders on|off     
1acc0 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61       Turn displa
1acd0 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20  y of headers on 
1ace0 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c  or off",.  ".hel
1acf0 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52  p ?-all? ?PATTER
1ad00 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74  N?   Show help t
1ad10 65 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22  ext for PATTERN"
1ad20 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c  ,.  ".import FIL
1ad30 45 20 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d  E TABLE       Im
1ad40 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46  port data from F
1ad50 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c  ILE into TABLE",
1ad60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ad70 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f  OMIT_TEST_CONTRO
1ad80 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49  L.  ".imposter I
1ad90 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20 43 72  NDEX TABLE    Cr
1ada0 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61  eate imposter ta
1adb0 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64  ble TABLE on ind
1adc0 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69  ex INDEX",.#endi
1add0 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54  f.  ".indexes ?T
1ade0 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68  ABLE?         Sh
1adf0 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65  ow names of inde
1ae00 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20  xes",.  "       
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69 73 20      If TABLE is 
1ae30 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
1ae40 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72  show indexes for
1ae50 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  ",.  "          
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1ae80 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65   TABLE using the
1ae90 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22   LIKE operator."
1aea0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1aeb0 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
1aec0 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20   ".iotrace FILE 
1aed0 20 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c             Enabl
1aee0 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63  e I/O diagnostic
1aef0 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45   logging to FILE
1af00 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69  ",.#endif.  ".li
1af10 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c  mit ?LIMIT? ?VAL
1af20 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72  ?     Display or
1af30 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1af40 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c  e of an SQLITE_L
1af50 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20  IMIT",.  ".lint 
1af60 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20  OPTIONS         
1af70 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74     Report potent
1af80 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65  ial schema issue
1af90 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74  s.",.  "     Opt
1afa0 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1afb0 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20     fkey-indexes 
1afc0 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67      Find missing
1afd0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64   foreign key ind
1afe0 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53  exes",.#ifndef S
1aff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
1b000 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f  EXTENSION.  ".lo
1b010 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20  ad FILE ?ENTRY? 
1b020 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78        Load an ex
1b030 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22  tension library"
1b040 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67  ,.#endif.  ".log
1b050 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20   FILE|off       
1b060 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e       Turn loggin
1b070 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49  g on or off.  FI
1b080 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72  LE can be stderr
1b090 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f  /stdout",.  ".mo
1b0a0 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
1b0b0 20 20 20 20 20 20 53 65 74 20 6f 75 74 70 75 74        Set output
1b0c0 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f   mode",.  "   MO
1b0d0 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a  DE is one of:",.
1b0e0 20 20 22 20 20 20 20 20 61 73 63 69 69 20 20 20    "     ascii   
1b0f0 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65   Columns/rows de
1b100 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20  limited by 0x1F 
1b110 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20  and 0x1E",.  "  
1b120 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d     csv      Comm
1b130 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75  a-separated valu
1b140 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c  es",.  "     col
1b150 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e  umn   Left-align
1b160 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65  ed columns.  (Se
1b170 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20  e .width)",.  " 
1b180 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
1b190 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c  L <table> code",
1b1a0 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72 74 20  .  "     insert 
1b1b0 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61    SQL insert sta
1b1c0 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c  tements for TABL
1b1d0 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65  E",.  "     line
1b1e0 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70       One value p
1b1f0 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20  er line",.  "   
1b200 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65    list     Value
1b210 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c  s delimited by \
1b220 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71  "|\"",.  "     q
1b230 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20 61  uote    Escape a
1b240 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53 51  nswers as for SQ
1b250 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73  L",.  "     tabs
1b260 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
1b270 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20  ed values",.  " 
1b280 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c      tcl      TCL
1b290 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c   list elements",
1b2a0 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53  .  ".nullvalue S
1b2b0 54 52 49 4e 47 20 20 20 20 20 20 20 20 55 73 65  TRING        Use
1b2c0 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65   STRING in place
1b2d0 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22   of NULL values"
1b2e0 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d  ,.  ".once (-e|-
1b2f0 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75  x|FILE)       Ou
1b300 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78  tput for the nex
1b310 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e  t SQL command on
1b320 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ly to FILE",.  "
1b330 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67       If FILE beg
1b340 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65  ins with '|' the
1b350 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65  n open as a pipe
1b360 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72  ",.  "     Other
1b370 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   options:",.  " 
1b380 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f        -e    Invo
1b390 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74 20 65  ke system text e
1b3a0 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20  ditor",.  "     
1b3b0 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20    -x    Open in 
1b3c0 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a  a spreadsheet",.
1b3d0 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e    ".open ?OPTION
1b3e0 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73  S? ?FILE?   Clos
1b3f0 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
1b400 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46  ase and reopen F
1b410 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70  ILE",.  "     Op
1b420 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1b430 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20      --append    
1b440 20 20 20 20 55 73 65 20 61 70 70 65 6e 64 76 66      Use appendvf
1b450 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61  s to append data
1b460 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  base to the end 
1b470 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66  of FILE",.#ifdef
1b480 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
1b490 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20  ESERIALIZE.  "  
1b4a0 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c        --deserial
1b4b0 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20  ize   Load into 
1b4c0 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71  memory useing sq
1b4d0 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
1b4e0 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20 20  e()",.  "       
1b4f0 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20 20   --hexdb        
1b500 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75 74   Load the output
1b510 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22 20   of \"dbtotxt\" 
1b520 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
1b530 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20  database",.  "  
1b540 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65 20        --maxsize 
1b550 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 73 69  N     Maximum si
1b560 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62 20 6f  ze for --hexdb o
1b570 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 64  r --deserialized
1b580 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65 6e 64   database",.#end
1b590 69 66 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  if.  "        --
1b5a0 6e 65 77 20 20 20 20 20 20 20 20 20 20 20 49 6e  new           In
1b5b0 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f  itialize FILE to
1b5c0 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61   an empty databa
1b5d0 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  se",.  "        
1b5e0 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20  --readonly      
1b5f0 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e  Open FILE readon
1b600 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  ly",.  "        
1b610 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20 20  --zip           
1b620 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72  FILE is a ZIP ar
1b630 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70  chive",.  ".outp
1b640 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20  ut ?FILE?       
1b650 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1b660 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75  to FILE or stdou
1b670 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69  t if FILE is omi
1b680 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49  tted",.  "     I
1b690 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69  f FILE begins wi
1b6a0 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e  th '|' then open
1b6b0 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c   it as a pipe.",
1b6c0 0a 20 20 22 2e 70 61 72 61 6d 65 74 65 72 20 43  .  ".parameter C
1b6d0 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61 6e  MD ...       Man
1b6e0 61 67 65 20 53 51 4c 20 70 61 72 61 6d 65 74 65  age SQL paramete
1b6f0 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22  r bindings",.  "
1b700 20 20 20 63 6c 65 61 72 20 20 20 20 20 20 20 20     clear        
1b710 20 20 20 20 20 20 20 20 20 20 20 45 72 61 73 65             Erase
1b720 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c 0a   all bindings",.
1b730 20 20 22 20 20 20 69 6e 69 74 20 20 20 20 20 20    "   init      
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1b750 69 74 69 61 6c 69 7a 65 20 74 68 65 20 54 45 4d  itialize the TEM
1b760 50 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f 6c  P table that hol
1b770 64 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  ds bindings",.  
1b780 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20  "   list        
1b790 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1b7a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72   the current par
1b7b0 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22  ameter bindings"
1b7c0 2c 0a 20 20 22 20 20 20 73 65 74 20 50 41 52 41  ,.  "   set PARA
1b7d0 4d 45 54 45 52 20 56 41 4c 55 45 20 20 20 20 20  METER VALUE     
1b7e0 47 69 76 65 6e 20 53 51 4c 20 70 61 72 61 6d 65  Given SQL parame
1b7f0 74 65 72 20 50 41 52 41 4d 45 54 45 52 20 61 20  ter PARAMETER a 
1b800 76 61 6c 75 65 20 6f 66 20 56 41 4c 55 45 22 2c  value of VALUE",
1b810 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1b830 41 52 41 4d 45 54 45 52 20 73 68 6f 75 6c 64 20  ARAMETER should 
1b840 73 74 61 72 74 20 77 69 74 68 20 27 24 27 2c 20  start with '$', 
1b850 27 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f 27  ':', '@', or '?'
1b860 22 2c 0a 20 20 22 20 20 20 75 6e 73 65 74 20 50  ",.  "   unset P
1b870 41 52 41 4d 45 54 45 52 20 20 20 20 20 20 20 20  ARAMETER        
1b880 20 52 65 6d 6f 76 65 20 50 41 52 41 4d 45 54 45   Remove PARAMETE
1b890 52 20 66 72 6f 6d 20 74 68 65 20 62 69 6e 64 69  R from the bindi
1b8a0 6e 67 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e 70  ng table",.  ".p
1b8b0 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20  rint STRING...  
1b8c0 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74         Print lit
1b8d0 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23 69  eral STRING",.#i
1b8e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b8f0 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
1b900 41 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73 73  ACK.  ".progress
1b910 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
1b920 49 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73 73 20  Invoke progress 
1b930 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 65 76  handler after ev
1b940 65 72 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c 0a  ery N opcodes",.
1b950 20 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e 20    "   --limit N 
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 49 6e 74 65 72 72 75 70 74 20 61 66 74 65 72 20  Interrupt after 
1b980 4e 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  N progress callb
1b990 61 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6f  acks",.  "   --o
1b9a0 6e 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20  nce             
1b9b0 20 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72         Do no mor
1b9c0 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67 72  e than one progr
1b9d0 65 73 73 20 69 6e 74 65 72 72 75 70 74 22 2c 0a  ess interrupt",.
1b9e0 20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d 71    "   --quiet|-q
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 4e 6f 20 6f 75 74 70 75 74 20 65 78 63 65 70 74  No output except
1ba10 20 61 74 20 69 6e 74 65 72 72 75 70 74 73 22 2c   at interrupts",
1ba20 0a 20 20 22 20 20 20 2d 2d 72 65 73 65 74 20 20  .  "   --reset  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
1ba50 20 66 6f 72 20 65 61 63 68 20 69 6e 70 75 74 20   for each input 
1ba60 61 6e 64 20 69 6e 74 65 72 72 75 70 74 22 2c 0a  and interrupt",.
1ba70 23 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d 70  #endif.  ".promp
1ba80 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20  t MAIN CONTINUE 
1ba90 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73     Replace the s
1baa0 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22  tandard prompts"
1bab0 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20  ,.  ".quit      
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1bad0 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22  it this program"
1bae0 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20  ,.  ".read FILE 
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1bb00 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49  ad input from FI
1bb10 4c 45 22 2c 0a 20 20 22 2e 72 65 63 6f 76 65 72  LE",.  ".recover
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 52 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   Recover as much
1bb40 20 64 61 74 61 20 61 73 20 70 6f 73 73 69 62 6c   data as possibl
1bb50 65 20 66 72 6f 6d 20 63 6f 72 72 75 70 74 20 64  e from corrupt d
1bb60 62 2e 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65  b.",.  ".restore
1bb70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
1bb80 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
1bb90 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
1bba0 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
1bbb0 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46  ILE",.  ".save F
1bbc0 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1bbd0 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72    Write in-memor
1bbe0 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  y database into 
1bbf0 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73  FILE",.  ".scans
1bc00 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  tats on|off     
1bc10 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f     Turn sqlite3_
1bc20 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
1bc30 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20  ) metrics on or 
1bc40 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61  off",.  ".schema
1bc50 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20   ?PATTERN?      
1bc60 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
1bc70 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74  E statements mat
1bc80 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a  ching PATTERN",.
1bc90 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a    "     Options:
1bca0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d  ",.  "         -
1bcb0 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20  -indent         
1bcc0 20 20 20 54 72 79 20 74 6f 20 70 72 65 74 74 79     Try to pretty
1bcd0 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d  -print the schem
1bce0 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74  a",.  ".selftest
1bcf0 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20   ?OPTIONS?      
1bd00 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65  Run tests define
1bd10 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53  d in the SELFTES
1bd20 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  T table",.  "   
1bd30 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1bd40 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20        --init    
1bd50 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74             Creat
1bd60 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54  e a new SELFTEST
1bd70 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1bd80 20 20 20 2d 76 20 20 20 20 20 20 20 20 20 20 20     -v           
1bd90 20 20 20 20 20 20 20 20 56 65 72 62 6f 73 65 20          Verbose 
1bda0 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70  output",.  ".sep
1bdb0 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
1bdc0 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
1bdd0 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73  column and row s
1bde0 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20  eparators",.#if 
1bdf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1be00 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
1be10 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45   ".session ?NAME
1be20 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74  ? CMD ...  Creat
1be30 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
1be40 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75  sions",.  "   Su
1be50 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22  bcommands:",.  "
1be60 20 20 20 20 20 61 74 74 61 63 68 20 54 41 42 4c       attach TABL
1be70 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74  E             At
1be80 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22  tach TABLE",.  "
1be90 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 46       changeset F
1bea0 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72  ILE           Wr
1beb0 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
1bec0 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1bed0 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20      close       
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1bef0 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c  se one session",
1bf00 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20  .  "     enable 
1bf10 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
1bf20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74    Set or query t
1bf30 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a  he enable bit",.
1bf40 20 20 22 20 20 20 20 20 66 69 6c 74 65 72 20 47    "     filter G
1bf50 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  LOB...          
1bf60 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d   Reject tables m
1bf70 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a  atching GLOBs",.
1bf80 20 20 22 20 20 20 20 20 69 6e 64 69 72 65 63 74    "     indirect
1bf90 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1bfa0 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74   Mark or query t
1bfb0 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74  he indirect stat
1bfc0 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65  us",.  "     ise
1bfd0 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20  mpty            
1bfe0 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74        Query whet
1bff0 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20  her the session 
1c000 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20  is empty",.  "  
1c010 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
1c020 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1c030 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
1c040 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a  session names",.
1c050 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20    "     open DB 
1c060 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
1c070 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
1c080 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20  ion on DB",.  " 
1c090 20 20 20 20 70 61 74 63 68 73 65 74 20 46 49 4c      patchset FIL
1c0a0 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69  E            Wri
1c0b0 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69 6e  te a patchset in
1c0c0 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1c0d0 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69  If ?NAME? is omi
1c0e0 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20  tted, the first 
1c0f0 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20  defined session 
1c100 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69  is used.",.#endi
1c110 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e  f.  ".sha3sum ..
1c120 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  .             Co
1c130 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73  mpute a SHA3 has
1c140 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  h of database co
1c150 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f  ntent",.  "    O
1c160 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1c170 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20     --schema     
1c180 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61           Also ha
1c190 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  sh the sqlite_ma
1c1a0 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22  ster table",.  "
1c1b0 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34        --sha3-224
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1c1d0 74 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67  the sha3-224 alg
1c1e0 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1c1f0 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20    --sha3-256    
1c200 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c210 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74  sha3-256 algorit
1c220 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  hm.  This is the
1c230 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20   default.",.  " 
1c240 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38 34 20       --sha3-384 
1c250 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1c260 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c 67 6f  he sha3-384 algo
1c270 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20  rithm",.  "     
1c280 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20 20 20   --sha3-512     
1c290 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1c2a0 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69 74 68  ha3-512 algorith
1c2b0 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79 20 6f  m",.  "    Any o
1c2c0 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  ther argument is
1c2d0 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20   a LIKE pattern 
1c2e0 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 68 61  for tables to ha
1c2f0 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  sh",.#ifndef SQL
1c300 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
1c310 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20  M.  ".shell CMD 
1c320 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20 52 75  ARGS...       Ru
1c330 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
1c340 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22   a system shell"
1c350 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f  ,.#endif.  ".sho
1c360 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
1c370 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75       Show the cu
1c380 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
1c390 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67   various setting
1c3a0 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f  s",.  ".stats ?o
1c3b0 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 20 20  n|off?          
1c3c0 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75  Show stats or tu
1c3d0 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f  rn stats on or o
1c3e0 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  ff",.#ifndef SQL
1c3f0 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
1c400 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44  M.  ".system CMD
1c410 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 52 75   ARGS...      Ru
1c420 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
1c430 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22   a system shell"
1c440 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62  ,.#endif.  ".tab
1c450 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  les ?TABLE?     
1c460 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
1c470 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  of tables matchi
1c480 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  ng LIKE pattern 
1c490 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74  TABLE",.  ".test
1c4a0 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20  case NAME       
1c4b0 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72 65      Begin redire
1c4c0 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20  cting output to 
1c4d0 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
1c4e0 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74  t'",.  ".timeout
1c4f0 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 20   MS             
1c500 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
1c510 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
1c520 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c  S milliseconds",
1c530 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  .  ".timer on|of
1c540 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72  f            Tur
1c550 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f  n SQL timer on o
1c560 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20  r off",.#ifndef 
1c570 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1c580 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54  E.  ".trace ?OPT
1c590 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75  IONS?         Ou
1c5a0 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74  tput each SQL st
1c5b0 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73  atement as it is
1c5c0 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49   run",.  "    FI
1c5d0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1c5e0 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1c5f0 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  t to FILE",.  " 
1c600 20 20 20 73 74 64 6f 75 74 20 20 20 20 20 20 20     stdout       
1c610 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20             Send 
1c620 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74  output to stdout
1c630 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72 72  ",.  "    stderr
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1c660 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20   stderr",.  "   
1c670 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20   off            
1c680 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c 65           Disable
1c690 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20   tracing",.  "  
1c6a0 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20    --expanded    
1c6b0 20 20 20 20 20 20 20 20 20 20 45 78 70 61 6e 64            Expand
1c6c0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1c6d0 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s",.#ifdef SQLIT
1c6e0 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
1c6f0 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d  ZE.  "    --norm
1c700 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20 20  alized          
1c710 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c    Normal the SQL
1c720 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65   statements",.#e
1c730 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c  ndif.  "    --pl
1c740 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
1c750 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20      Show SQL as 
1c760 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20  it is input",.  
1c770 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20  "    --stmt     
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1c790 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65  ce statement exe
1c7a0 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54  cution (SQLITE_T
1c7b0 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22  RACE_STMT)",.  "
1c7c0 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20      --profile   
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 66              Prof
1c7e0 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28  ile statements (
1c7f0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f  SQLITE_TRACE_PRO
1c800 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d  FILE)",.  "    -
1c810 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  -row            
1c820 20 20 20 20 20 20 20 54 72 61 63 65 20 65 61 63         Trace eac
1c830 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52  h row (SQLITE_TR
1c840 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20  ACE_ROW)",.  "  
1c850 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20    --close       
1c860 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20            Trace 
1c870 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65  connection close
1c880 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43   (SQLITE_TRACE_C
1c890 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f  LOSE)",.#endif /
1c8a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
1c8b0 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e  ACE */.  ".vfsin
1c8c0 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  fo ?AUX?        
1c8d0 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
1c8e0 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
1c8f0 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73  el VFS",.  ".vfs
1c900 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1c910 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76       List all av
1c920 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a  ailable VFSes",.
1c930 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
1c940 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e  ?           Prin
1c950 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
1c960 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20  e VFS stack",.  
1c970 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d  ".width NUM1 NUM
1c980 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f  2 ...     Set co
1c990 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
1c9a0 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22  \"column\" mode"
1c9b0 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74 69  ,.  "     Negati
1c9c0 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d  ve values right-
1c9d0 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a  justify",.};../*
1c9e0 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20  .** Output help 
1c9f0 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74  text..**.** zPat
1ca00 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20 74  tern describes t
1ca10 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e  he set of comman
1ca20 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c  ds for which hel
1ca30 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64  p text is provid
1ca40 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65  ed..** If zPatte
1ca50 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rn is NULL, then
1ca60 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e   show all comman
1ca70 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76  ds, but only giv
1ca80 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20  e a one-line.** 
1ca90 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65  description of e
1caa0 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ach..**.** Retur
1cab0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1cac0 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
1cad0 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28  ic int showHelp(
1cae0 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
1caf0 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29   char *zPattern)
1cb00 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1cb10 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e   int j = 0;.  in
1cb20 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  t n = 0;.  char 
1cb30 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61  *zPat;.  if( zPa
1cb40 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a  ttern==0.   || z
1cb50 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a  Pattern[0]=='0'.
1cb60 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1cb70 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20  ttern,"-a")==0. 
1cb80 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74    || strcmp(zPat
1cb90 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a  tern,"-all")==0.
1cba0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77    ){.    /* Show
1cbb0 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1cbc0 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65  ut only one line
1cbd0 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   per command */.
1cbe0 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e      if( zPattern
1cbf0 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d  ==0 ) zPattern =
1cc00 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   "";.    for(i=0
1cc10 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1cc20 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Help); i++){.   
1cc30 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d     if( azHelp[i]
1cc40 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74  [0]=='.' || zPat
1cc50 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20  tern[0] ){.     
1cc60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1cc70 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1cc80 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1cc90 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1cca0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ccb0 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1ccc0 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77 68  ands that for wh
1ccd0 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20  ich zPattern is 
1cce0 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78 20  an exact prefix 
1ccf0 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1cd00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e  lite3_mprintf(".
1cd10 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b  %s*", zPattern);
1cd20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cd30 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1cd40 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1cd50 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1cd60 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b  ob(zPat, azHelp[
1cd70 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1cd80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1cd90 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1cda0 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a  p[i]);.        j
1cdb0 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
1cdc0 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1cdd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1cde0 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69  ree(zPat);.    i
1cdf0 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  f( n ){.      if
1ce00 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( n==1 ){.      
1ce10 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65    /* when zPatte
1ce20 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rn is a prefix o
1ce30 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  f exactly one co
1ce40 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c  mmand, then incl
1ce50 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ude the.        
1ce60 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  ** details of th
1ce70 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63  at command, whic
1ce80 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61  h should begin a
1ce90 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20  t offset j */.  
1cea0 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1ceb0 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1cec0 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b  -1 && azHelp[j][
1ced0 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1cee0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1cef0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1cf00 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1cf10 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1cf20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1cf30 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d   return n;.    }
1cf40 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
1cf50 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63   commands that c
1cf60 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20  ontain zPattern 
1cf70 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20  anywhere.  Show 
1cf80 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  the complete.   
1cf90 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20   ** text of all 
1cfa0 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61  commands that ma
1cfb0 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74  tch. */.    zPat
1cfc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1cfd0 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61  tf("%%%s%%", zPa
1cfe0 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1cff0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1d000 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1d010 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70        if( azHelp
1d020 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20  [i][0]=='.' ) j 
1d030 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = i;.      if( s
1d040 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
1d050 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20  Pat, azHelp[i], 
1d060 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
1d070 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1d080 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1d090 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68  [j]);.        wh
1d0a0 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1d0b0 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1d0c0 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e  Help[j+1][0]!='.
1d0d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ' ){.          j
1d0e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  ++;.          ut
1d0f0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1d100 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d  %s\n", azHelp[j]
1d110 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d120 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20       i = j;.    
1d130 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
1d140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d150 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20  e3_free(zPat);. 
1d160 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d170 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1d180 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
1d190 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
1d1a0 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
1d1b0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  );../*.** Read t
1d1c0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  he content of fi
1d1d0 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65  le zName into me
1d1e0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1d1f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1d200 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74  c64().** and ret
1d210 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1d220 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65   the buffer. The
1d230 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1d240 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
1d250 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  ng.** the memory
1d260 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1d270 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e  eter pnByte is n
1d280 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74  ot NULL, (*pnByt
1d290 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  e) is set to the
1d2a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1d2b0 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  .** read..**.** 
1d2c0 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c  For convenience,
1d2d0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f   a nul-terminato
1d2e0 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73  r byte is always
1d2f0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1d300 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72   data read.** fr
1d310 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  om the file befo
1d320 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73  re the buffer is
1d330 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1d340 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c  byte is not incl
1d350 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66  uded in.** the f
1d360 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a  inal value of (*
1d370 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c  pnByte), if appl
1d380 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55  icable..**.** NU
1d390 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1d3a0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
1d3b0 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20  ncountered. The 
1d3c0 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
1d3d0 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64  pnByte.** is und
1d3e0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1d3f0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
1d400 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f  har *readFile(co
1d410 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1d420 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1d430 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65   FILE *in = fope
1d440 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1d450 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69    long nIn;.  si
1d460 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68  ze_t nRead;.  ch
1d470 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20  ar *pBuf;.  if( 
1d480 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
1d490 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
1d4a0 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
1d4b0 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
1d4c0 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
1d4d0 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
1d4e0 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b  lloc64( nIn+1 );
1d4f0 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
1d500 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65  { fclose(in); re
1d510 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61  turn 0; }.  nRea
1d520 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
1d530 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
1d540 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
1d550 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
1d560 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
1d570 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
1d580 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
1d590 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
1d5a0 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
1d5b0 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
1d5c0 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
1d5d0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d5e0 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
1d5f0 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
1d600 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1d610 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
1d620 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
1d630 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
1d640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d650 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
1d660 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1d670 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
1d680 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
1d690 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
1d6a0 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
1d6b0 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1d6c0 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
1d6d0 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1d6e0 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1d6f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d700 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1d710 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
1d720 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1d730 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
1d740 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
1d750 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
1d760 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
1d770 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
1d780 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
1d790 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
1d7a0 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
1d7b0 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
1d7c0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1d7d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1d7e0 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
1d7f0 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
1d800 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
1d810 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1d820 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
1d830 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
1d840 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
1d850 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
1d860 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
1d870 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
1d880 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
1d890 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
1d8a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
1d8b0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1d8c0 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
1d8d0 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
1d8e0 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
1d8f0 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
1d900 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
1d910 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
1d920 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
1d930 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
1d940 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d950 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1d960 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
1d970 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
1d980 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
1d990 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
1d9a0 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
1d9b0 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
1d9c0 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
1d9d0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1d9e0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1d9f0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1da00 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
1da10 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1da20 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
1da30 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1da40 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
1da50 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
1da60 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66  duce the type of
1da70 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20   file for zName 
1da80 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e  based on its con
1da90 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tent.  Return.**
1daa0 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c   one of the SHEL
1dab0 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e  L_OPEN_* constan
1dac0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1dad0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1dae0 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1daf0 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f   but its name lo
1db00 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a  oks like a ZIP.*
1db10 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68  * archive and th
1db20 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69  e dfltZip flag i
1db30 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73  s true, then ass
1db40 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50 20  ume it is a ZIP 
1db50 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65  archive..** Othe
1db60 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e  rwise, assume an
1db70 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62 61   ordinary databa
1db80 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  se regardless of
1db90 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66   the filename if
1dba0 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e  .** the type can
1dbb0 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  not be determine
1dbc0 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a  d from content..
1dbd0 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74  */.int deduceDat
1dbe0 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20  abaseType(const 
1dbf0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1dc00 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c   dfltZip){.  FIL
1dc10 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61  E *f = fopen(zNa
1dc20 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a  me, "rb");.  siz
1dc30 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20  e_t n;.  int rc 
1dc40 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
1dc50 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  PEC;.  char zBuf
1dc60 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d  [100];.  if( f==
1dc70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c  0 ){.    if( dfl
1dc80 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1dc90 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1dca0 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1dcb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45        return SHE
1dcc0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1dcd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dce0 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f     return SHELL_
1dcf0 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
1dd00 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65   }.  }.  n = fre
1dd10 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20  ad(zBuf, 16, 1, 
1dd20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1dd30 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1dd40 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22  SQLite format 3"
1dd50 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 16)==0 ){.    
1dd60 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72  fclose(f);.    r
1dd70 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1dd80 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66  _NORMAL;.  }.  f
1dd90 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45  seek(f, -25, SEE
1dda0 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72  K_END);.  n = fr
1ddb0 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c  ead(zBuf, 25, 1,
1ddc0 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1ddd0 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1dde0 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65  "Start-Of-SQLite
1ddf0 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  3-", 17)==0 ){. 
1de00 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1de10 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
1de20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b  }else{.    fseek
1de30 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e  (f, -22, SEEK_EN
1de40 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  D);.    n = frea
1de50 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66  d(zBuf, 22, 1, f
1de60 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20  );.    if( n==1 
1de70 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30  && zBuf[0]==0x50
1de80 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34   && zBuf[1]==0x4
1de90 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78  b && zBuf[2]==0x
1dea0 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75  05.       && zBu
1deb0 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20  f[3]==0x06 ){.  
1dec0 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1ded0 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1dee0 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
1def0 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  && dfltZip && sq
1df00 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1df10 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1df20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1df30 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1df40 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
1df50 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74  fclose(f);.  ret
1df60 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66  urn rc;  .}..#if
1df70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1df80 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a  E_DESERIALIZE./*
1df90 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20  .** Reconstruct 
1dfa0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1dfb0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1dfc0 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
1dfd0 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f  "dbtotxt".** pro
1dfe0 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74  gram.  Read cont
1dff0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ent from the fil
1e000 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  e in p->zDbFilen
1e010 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46  ame.  If p->zDbF
1e020 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c  ilename.** is 0,
1e030 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
1e040 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a  standard input..
1e050 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
1e060 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65 78  ed char *readHex
1e070 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  Db(ShellState *p
1e080 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a  , int *pnData){.
1e090 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e0a0 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  *a = 0;.  int nL
1e0b0 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ine;.  int n = 0
1e0c0 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30  ;.  int pgsz = 0
1e0d0 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20  ;.  int iOffset 
1e0e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  = 0;.  int j, k;
1e0f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c  .  int rc;.  FIL
1e100 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  E *in;.  unsigne
1e110 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20 63  d int x[16];.  c
1e120 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
1e130 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c  .  if( p->zDbFil
1e140 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20  ename ){.    in 
1e150 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  = fopen(p->zDbFi
1e160 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20  lename, "r");.  
1e170 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1e180 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e190 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
1e1a0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
1e1b0 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e   reading\n", p->
1e1c0 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1e1d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e1e0 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20    }.    nLine = 
1e1f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e200 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20  in = p->in;.    
1e210 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e  nLine = p->linen
1e220 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61  o;.  }.  *pnData
1e230 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b   = 0;.  nLine++;
1e240 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
1e250 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e260 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74 6f  ), in)==0 ) goto
1e270 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e280 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28  ;.  rc = sscanf(
1e290 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20 25  zLine, "| size %
1e2a0 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20  d pagesize %d", 
1e2b0 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69 66  &n, &pgsz);.  if
1e2c0 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20 72  ( rc!=2 ) goto r
1e2d0 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a  eadHexDb_error;.
1e2e0 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f 74    if( n<=0 ) got
1e2f0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e300 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33  r;.  a = sqlite3
1e310 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  _malloc( n );.  
1e320 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
1e330 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e340 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "Out of memo
1e350 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ry!\n");.    got
1e360 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e370 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  r;.  }.  memset(
1e380 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  a, 0, n);.  if( 
1e390 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a  pgsz<512 || pgsz
1e3a0 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 20  >65536 || (pgsz 
1e3b0 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29  & (pgsz-1))!=0 )
1e3c0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1e3d0 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61 6c  f(stderr, "inval
1e3e0 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b  id pagesize\n");
1e3f0 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65  .    goto readHe
1e400 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  xDb_error;.  }. 
1e410 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67   for(nLine++; fg
1e420 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
1e430 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30  f(zLine), in)!=0
1e440 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20  ; nLine++){.    
1e450 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e460 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f 66  e, "| page %d of
1e470 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b  fset %d", &j, &k
1e480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 32  );.    if( rc==2
1e490 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73 65   ){.      iOffse
1e4a0 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e  t = k;.      con
1e4b0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1e4c0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69   if( strncmp(zLi
1e4d0 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29  ne, "| end ", 6)
1e4e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
1e4f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1e500 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c   = sscanf(zLine,
1e510 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78 20  "| %d: %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 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e540 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20 20   %x %x",.       
1e550 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78 5b           &j, &x[
1e560 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32 5d  0], &x[1], &x[2]
1e570 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c 20  , &x[3], &x[4], 
1e580 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26 78  &x[5], &x[6], &x
1e590 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [7],.           
1e5a0 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b 39       &x[8], &x[9
1e5b0 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31 31  ], &x[10], &x[11
1e5c0 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31 33  ], &x[12], &x[13
1e5d0 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31 35  ], &x[14], &x[15
1e5e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ]);.    if( rc==
1e5f0 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20  17 ){.      k = 
1e600 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20 20  iOffset+j;.     
1e610 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b 0a   if( k+16<=n ){.
1e620 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1e630 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
1e640 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20 61  ; ii<16; ii++) a
1e650 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26 30  [k+ii] = x[ii]&0
1e660 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xff;.      }.   
1e670 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61   }.  }.  *pnData
1e680 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21 3d   = n;.  if( in!=
1e690 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c  p->in ){.    fcl
1e6a0 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  ose(in);.  }else
1e6b0 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  {.    p->lineno 
1e6c0 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 72  = nLine;.  }.  r
1e6d0 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48 65  eturn a;..readHe
1e6e0 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  xDb_error:.  if(
1e6f0 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20 20   in!=stdin ){.  
1e700 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1e710 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1e720 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ( fgets(zLine, s
1e730 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 2d  izeof(zLine), p-
1e740 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  >in)!=0 ){.     
1e750 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20   nLine++;.      
1e760 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65  if(strncmp(zLine
1e770 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d  , "| end ", 6)==
1e780 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
1e790 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d  .    p->lineno =
1e7a0 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73 71   nLine;.  }.  sq
1e7b0 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
1e7c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e7d0 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69  err,"Error on li
1e7e0 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62  ne %d of --hexdb
1e7f0 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65   input\n", nLine
1e800 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1e810 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e820 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
1e830 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  LIZE */../*.** S
1e840 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22  calar function "
1e850 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2e 20 54 68  shell_int32". Th
1e860 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e870 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1e880 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 20 62  n.** must be a b
1e890 6c 6f 62 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  lob. The second 
1e8a0 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
1e8b0 6e 74 65 67 65 72 2e 20 54 68 69 73 20 66 75 6e  nteger. This fun
1e8c0 63 74 69 6f 6e 0a 2a 2a 20 72 65 61 64 73 20 61  ction.** reads a
1e8d0 6e 64 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d  nd returns a 32-
1e8e0 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  bit big-endian i
1e8f0 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 79 74 65  nteger from byte
1e900 0a 2a 2a 20 6f 66 66 73 65 74 20 28 34 2a 3c 61  .** offset (4*<a
1e910 72 67 32 3e 29 20 6f 66 20 74 68 65 20 62 6c 6f  rg2>) of the blo
1e920 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
1e930 64 20 73 68 65 6c 6c 49 6e 74 33 32 28 0a 20 20  d shellInt32(.  
1e940 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e950 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
1e960 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65   argc, .  sqlite
1e970 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1e980 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1e990 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a  ed char *pBlob;.
1e9a0 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 69    int nBlob;.  i
1e9b0 6e 74 20 69 49 6e 74 3b 0a 20 20 0a 20 20 6e 42  nt iInt;.  .  nB
1e9c0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
1e9d0 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1e9e0 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63  ]);.  pBlob = (c
1e9f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ea00 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1ea10 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
1ea20 0a 20 20 69 49 6e 74 20 3d 20 73 71 6c 69 74 65  .  iInt = sqlite
1ea30 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
1ea40 5b 31 5d 29 3b 0a 0a 20 20 69 66 28 20 69 49 6e  [1]);..  if( iIn
1ea50 74 3e 3d 30 20 26 26 20 28 69 49 6e 74 2b 31 29  t>=0 && (iInt+1)
1ea60 2a 34 3c 3d 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  *4<=nBlob ){.   
1ea70 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1ea80 63 68 61 72 20 2a 61 20 3d 20 26 70 42 6c 6f 62  char *a = &pBlob
1ea90 5b 69 49 6e 74 2a 34 5d 3b 0a 20 20 20 20 73 71  [iInt*4];.    sq
1eaa0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c  lite3_int64 iVal
1eab0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
1eac0 36 34 29 61 5b 30 5d 3c 3c 32 34 29 0a 20 20 20  64)a[0]<<24).   
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f      + ((sqlite3_
1eaf0 69 6e 74 36 34 29 61 5b 31 5d 3c 3c 31 36 29 0a  int64)a[1]<<16).
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74         + ((sqlit
1eb20 65 33 5f 69 6e 74 36 34 29 61 5b 32 5d 3c 3c 20  e3_int64)a[2]<< 
1eb30 38 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8).             
1eb40 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 73 71            + ((sq
1eb50 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 33 5d  lite3_int64)a[3]
1eb60 3c 3c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  << 0);.    sqlit
1eb70 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
1eb80 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a  context, iVal);.
1eb90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61    }.}../*.** Sca
1eba0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73 68  lar function "sh
1ebb0 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22  ell_escape_crnl"
1ebc0 20 75 73 65 64 20 62 79 20 74 68 65 20 2e 72 65   used by the .re
1ebd0 63 6f 76 65 72 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  cover command..*
1ebe0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70  * The argument p
1ebf0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1ec00 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6f 75  nction is the ou
1ec10 74 70 75 74 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tput of built-in
1ec20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 71 75 6f  .** function quo
1ec30 74 65 28 29 2e 20 49 66 20 74 68 65 20 66 69 72  te(). If the fir
1ec40 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
1ec50 74 68 65 20 69 6e 70 75 74 20 69 73 20 22 27 22  the input is "'"
1ec60 2c 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  , .** indicating
1ec70 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1ec80 70 61 73 73 65 64 20 74 6f 20 71 75 6f 74 65 28  passed to quote(
1ec90 29 20 77 61 73 20 61 20 74 65 78 74 20 76 61 6c  ) was a text val
1eca0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ue,.** then this
1ecb0 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
1ecc0 65 73 20 74 68 65 20 69 6e 70 75 74 20 66 6f 72  es the input for
1ecd0 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
1ece0 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 61 6e 64  haracters.** and
1ecf0 20 61 64 64 73 20 61 20 77 72 61 70 70 65 72 20   adds a wrapper 
1ed00 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 66  similar to the f
1ed10 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1ed20 20 20 72 65 70 6c 61 63 65 28 72 65 70 6c 61 63    replace(replac
1ed30 65 28 3c 69 6e 70 75 74 3e 2c 20 27 5c 6e 27 2c  e(<input>, '\n',
1ed40 20 63 68 61 72 28 31 30 29 2c 20 27 5c 72 27 2c   char(10), '\r',
1ed50 20 63 68 61 72 28 31 33 29 29 3b 0a 2a 2a 0a 2a   char(13));.**.*
1ed60 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72  * Or, if the fir
1ed70 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
1ed80 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f 74  the input is not
1ed90 20 22 27 22 2c 20 74 68 65 6e 20 61 20 63 6f 70   "'", then a cop
1eda0 79 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75  y.** of the inpu
1edb0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  t is returned..*
1edc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
1edd0 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 28 0a 20  ellEscapeCrnl(. 
1ede0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1edf0 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
1ee00 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
1ee10 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1ee20 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1ee30 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
1ee40 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1ee50 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
1ee60 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 5b 30  );.  if( zText[0
1ee70 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69  ]=='\'' ){.    i
1ee80 6e 74 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74  nt nText = sqlit
1ee90 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
1eea0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74  rgv[0]);.    int
1eeb0 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   i;.    char zBu
1eec0 66 31 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72  f1[20];.    char
1eed0 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
1eee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20  const char *zNL 
1eef0 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
1ef00 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20  har *zCR = 0;.  
1ef10 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20    int nCR = 0;. 
1ef20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
1ef30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54  .    for(i=0; zT
1ef40 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ext[i]; i++){.  
1ef50 20 20 20 20 69 66 28 20 7a 4e 4c 3d 3d 30 20 26      if( zNL==0 &
1ef60 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e 27  & zText[i]=='\n'
1ef70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 4c 20   ){.        zNL 
1ef80 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
1ef90 7a 54 65 78 74 2c 20 22 5c 5c 6e 22 2c 20 22 5c  zText, "\\n", "\
1efa0 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20  \012", zBuf1);. 
1efb0 20 20 20 20 20 20 20 6e 4e 4c 20 3d 20 28 69 6e         nNL = (in
1efc0 74 29 73 74 72 6c 65 6e 28 7a 4e 4c 29 3b 0a 20  t)strlen(zNL);. 
1efd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1efe0 20 7a 43 52 3d 3d 30 20 26 26 20 7a 54 65 78 74   zCR==0 && zText
1eff0 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  [i]=='\r' ){.   
1f000 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65       zCR = unuse
1f010 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74 2c 20  d_string(zText, 
1f020 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20  "\\r", "\\015", 
1f030 7a 42 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20  zBuf2);.        
1f040 6e 43 52 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  nCR = (int)strle
1f050 6e 28 7a 43 52 29 3b 0a 20 20 20 20 20 20 7d 0a  n(zCR);.      }.
1f060 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a      }..    if( z
1f070 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a 20 20 20  NL || zCR ){.   
1f080 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
1f090 0a 20 20 20 20 20 20 69 36 34 20 6e 4d 61 78 20  .      i64 nMax 
1f0a0 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52 29 20 3f 20  = (nNL > nCR) ? 
1f0b0 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20 20 20 20  nNL : nCR;.     
1f0c0 20 69 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d   i64 nAlloc = nM
1f0d0 61 78 20 2a 20 6e 54 65 78 74 20 2b 20 28 6e 4d  ax * nText + (nM
1f0e0 61 78 2b 31 32 29 2a 32 3b 0a 20 20 20 20 20 20  ax+12)*2;.      
1f0f0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63 68  char *zOut = (ch
1f100 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ar*)sqlite3_mall
1f110 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  oc64(nAlloc);.  
1f120 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
1f130 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f140 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
1f150 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
1f160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
1f170 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1f180 66 28 20 7a 4e 4c 20 26 26 20 7a 43 52 20 29 7b  f( zNL && zCR ){
1f190 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f1a0 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72 65  &zOut[iOut], "re
1f1b0 70 6c 61 63 65 28 72 65 70 6c 61 63 65 28 22 2c  place(replace(",
1f1c0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69 4f   16);.        iO
1f1d0 75 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20  ut += 16;.      
1f1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1f1f0 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74  emcpy(&zOut[iOut
1f200 5d 2c 20 22 72 65 70 6c 61 63 65 28 22 2c 20 38  ], "replace(", 8
1f210 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20  );.        iOut 
1f220 2b 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += 8;.      }.  
1f230 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65      for(i=0; zTe
1f240 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  xt[i]; i++){.   
1f250 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69       if( zText[i
1f260 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
1f270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75       memcpy(&zOu
1f280 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e  t[iOut], zNL, nN
1f290 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  L);.          iO
1f2a0 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20  ut += nNL;.     
1f2b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 65     }else if( zTe
1f2c0 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20  xt[i]=='\r' ){. 
1f2d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f2e0 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52  &zOut[iOut], zCR
1f2f0 2c 20 6e 43 52 29 3b 0a 20 20 20 20 20 20 20 20  , nCR);.        
1f300 20 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a 20    iOut += nCR;. 
1f310 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f320 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 4f 75          zOut[iOu
1f330 74 5d 20 3d 20 7a 54 65 78 74 5b 69 5d 3b 0a 20  t] = zText[i];. 
1f340 20 20 20 20 20 20 20 20 20 69 4f 75 74 2b 2b 3b           iOut++;
1f350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f360 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   }..      if( zN
1f370 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  L ){.        mem
1f380 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f390 20 22 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20   ",'", 2); iOut 
1f3a0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65  += 2;.        me
1f3b0 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f3c0 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20 69 4f 75  , zNL, nNL); iOu
1f3d0 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20  t += nNL;.      
1f3e0 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f3f0 4f 75 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31  Out], "', char(1
1f400 30 29 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20  0))", 12); iOut 
1f410 2b 3d 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 20  += 12;.      }. 
1f420 20 20 20 20 20 69 66 28 20 7a 43 52 20 29 7b 0a       if( zCR ){.
1f430 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f440 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22  zOut[iOut], ",'"
1f450 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b  , 2); iOut += 2;
1f460 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f470 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52  &zOut[iOut], zCR
1f480 2c 20 6e 43 52 29 3b 20 69 4f 75 74 20 2b 3d 20  , nCR); iOut += 
1f490 6e 43 52 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nCR;.        mem
1f4a0 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f4b0 20 22 27 2c 20 63 68 61 72 28 31 33 29 29 22 2c   "', char(13))",
1f4c0 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32   12); iOut += 12
1f4d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f4e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f4f0 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 4f  text(context, zO
1f500 75 74 2c 20 69 4f 75 74 2c 20 53 51 4c 49 54 45  ut, iOut, SQLITE
1f510 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
1f520 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f530 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
1f540 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
1f550 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f560 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
1f570 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20  argv[0]);.}../* 
1f580 46 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64  Flags for open_d
1f590 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  b()..**.** The d
1f5a0 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
1f5b0 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20  of open_db() is 
1f5c0 74 6f 20 65 78 69 74 28 31 29 20 69 66 20 74 68  to exit(1) if th
1f5d0 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
1f5e0 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68   to.** open.  Th
1f5f0 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  e OPEN_DB_KEEPAL
1f600 49 56 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73  IVE flag changes
1f610 20 74 68 61 74 20 73 6f 20 74 68 61 74 20 69 74   that so that it
1f620 20 70 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72   prints an error
1f630 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65  .** but still re
1f640 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61  turns without ca
1f650 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a  lling exit..**.*
1f660 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  * The OPEN_DB_ZI
1f670 50 46 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65  PFILE flag cause
1f680 73 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70  s open_db() to p
1f690 72 65 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69  refer to open fi
1f6a0 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20  les as a.** ZIP 
1f6b0 61 72 63 68 69 76 65 20 69 66 20 74 68 65 20 66  archive if the f
1f6c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1f6d0 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61  st or is empty a
1f6e0 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63  nd its name matc
1f6f0 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70  hes.** the *.zip
1f700 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65   pattern..*/.#de
1f710 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45  fine OPEN_DB_KEE
1f720 50 41 4c 49 56 45 20 20 20 30 78 30 30 31 20 20  PALIVE   0x001  
1f730 20 2f 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72   /* Return after
1f740 20 65 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a   error if true *
1f750 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44  /.#define OPEN_D
1f760 42 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78  B_ZIPFILE     0x
1f770 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73  002   /* Open as
1f780 20 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74   ZIP if name mat
1f790 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f  ches *.zip */../
1f7a0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1f7b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
1f7c0 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e  pen.  If it is n
1f7d0 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74  ot, then open it
1f7e0 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74  .  If.** the dat
1f7f0 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f  abase fails to o
1f800 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72  pen, print an er
1f810 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
1f820 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  exit..*/.static 
1f830 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65  void open_db(She
1f840 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1f850 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66  openFlags){.  if
1f860 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
1f870 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
1f880 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  e==SHELL_OPEN_UN
1f890 53 50 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66  SPEC ){.      if
1f8a0 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  ( p->zDbFilename
1f8b0 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c  ==0 || p->zDbFil
1f8c0 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20  ename[0]==0 ){. 
1f8d0 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f         p->openMo
1f8e0 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
1f8f0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65  NORMAL;.      }e
1f900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
1f910 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64  openMode = (u8)d
1f920 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1f930 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  e(p->zDbFilename
1f940 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45  (openFlags & OPE
1f970 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30  N_DB_ZIPFILE)!=0
1f980 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f990 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
1f9a0 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20  openMode ){.    
1f9b0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1f9c0 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20  N_APPENDVFS: {. 
1f9d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
1f9e0 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c  pen_v2(p->zDbFil
1f9f0 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a  ename, &p->db, .
1fa00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1fa10 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1fa20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
1fa30 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b  ATE, "apndvfs");
1fa40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1fa50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1fa60 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  se SHELL_OPEN_HE
1fa70 58 44 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20  XDB:.      case 
1fa80 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52  SHELL_OPEN_DESER
1fa90 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  IALIZE: {.      
1faa0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30    sqlite3_open(0
1fab0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1fac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fad0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1fae0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a  LL_OPEN_ZIPFILE:
1faf0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1fb00 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
1fb10 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  :", &p->db);.   
1fb20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fb30 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1fb40 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
1fb50 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LY: {.        sq
1fb60 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d  lite3_open_v2(p-
1fb70 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
1fb80 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ->db, SQLITE_OPE
1fb90 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
1fba0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1fbc0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  e SHELL_OPEN_UNS
1fbd0 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  PEC:.      case 
1fbe0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1fbf0 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L: {.        sql
1fc00 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62  ite3_open(p->zDb
1fc10 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1fc20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1fc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc40 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70      globalDb = p
1fc50 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d  ->db;.    if( p-
1fc60 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  >db==0 || SQLITE
1fc70 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
1fc80 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
1fc90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1fca0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
1fcb0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
1fcc0 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
1fcd0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1fce0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c   p->zDbFilename,
1fcf0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1fd00 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
1fd10 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  f( openFlags & O
1fd20 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
1fd30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fd40 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
1fd50 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  y:", &p->db);.  
1fd60 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1fd70 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 69 74      }.      exit
1fd80 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  (1);.    }.#ifnd
1fd90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1fda0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
1fdb0 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
1fdc0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
1fdd0 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69  p->db, 1);.#endi
1fde0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  f.    sqlite3_fi
1fdf0 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  leio_init(p->db,
1fe00 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1fe10 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69  te3_shathree_ini
1fe20 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1fe30 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70      sqlite3_comp
1fe40 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64  letion_init(p->d
1fe50 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
1fe60 6c 69 74 65 33 5f 64 62 64 61 74 61 5f 69 6e 69  lite3_dbdata_ini
1fe70 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1fe80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1fe90 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69  VE_ZLIB.    sqli
1fea0 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74  te3_zipfile_init
1feb0 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1fec0 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72     sqlite3_sqlar
1fed0 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
1fee0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
1fef0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1ff00 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1ff10 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22  hell_add_schema"
1ff20 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 3, SQLITE_UTF8
1ff30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e   shellAddSchemaN
1ff60 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ame, 0, 0);.    
1ff70 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1ff80 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1ff90 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
1ffa0 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ema", 1, SQLITE_
1ffb0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65       shellModule
1ffe0 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20  Schema, 0, 0);. 
1fff0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20000 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20010 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
20020 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
20030 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , p,.           
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
20060 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
20070 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
20080 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
20090 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22 2c 20 31  _escape_crnl", 1
200a0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
200b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
200d0 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 2c 20 30  ellEscapeCrnl, 0
200e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
200f0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
20100 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
20110 69 6e 74 33 32 22 2c 20 32 2c 20 53 51 4c 49 54  int32", 2, SQLIT
20120 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 20 20 73 68 65 6c 6c 49 6e 74 33         shellInt3
20150 32 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  2, 0, 0);.#ifnde
20160 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
20170 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74  SYSTEM.    sqlit
20180 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
20190 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
201a0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
201b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201d0 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
201e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
201f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
20200 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20  >db, "edit", 2, 
20210 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
20240 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Func, 0, 0);.#en
20250 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  dif.    if( p->o
20260 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
20270 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20  PEN_ZIPFILE ){. 
20280 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
20290 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
202a0 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  f(.         "CRE
202b0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
202c0 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66  E zip USING zipf
202d0 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44  ile(%Q);", p->zD
202e0 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  bFilename);.    
202f0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
20300 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
20310 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
20320 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
20330 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20340 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
20350 49 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a  IALIZE.    else.
20360 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
20370 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20380 44 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70  DESERIALIZE || p
20390 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
203a0 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a  L_OPEN_HEXDB ){.
203b0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
203c0 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20      int nData = 
203d0 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  0;.      unsigne
203e0 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
203f0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
20400 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
20410 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a  _DESERIALIZE ){.
20420 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
20430 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
20440 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46  readFile(p->zDbF
20450 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29  ilename, &nData)
20460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20470 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 72         aData = r
20480 65 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44 61  eadHexDb(p, &nDa
20490 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
204a0 20 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20   aData==0 ){.   
204b0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
204c0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
204d0 72 20 69 6e 20 68 65 78 64 62 20 69 6e 70 75 74  r in hexdb input
204e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
204f0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
20500 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73  rc = sqlite3_des
20520 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20  erialize(p->db, 
20530 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e  "main", aData, n
20540 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20  Data, nData,.   
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
20570 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a  ZE_RESIZEABLE |.
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49     SQLITE_DESERI
205a0 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53  ALIZE_FREEONCLOS
205b0 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
205c0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
205d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
205e0 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f  "Error: sqlite3_
205f0 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72 65  deserialize() re
20600 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
20610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20620 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20 29  if( p->szMax>0 )
20630 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20640 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
20650 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51  ->db, "main", SQ
20660 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
20670 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61 78  LIMIT, &p->szMax
20680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20690 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
206a0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
206b0 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
206c0 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  es connection.  
206d0 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 2a  Report errors..*
206e0 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62 28  /.void close_db(
206f0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
20700 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
20710 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69 66  _close(db);.  if
20720 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
20730 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20740 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f  "Error: sqlite3_
20750 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73 20  close() returns 
20760 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %d: %s\n",.     
20770 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f 65     rc, sqlite3_e
20780 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 20  rrmsg(db));.  } 
20790 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41  .}..#if HAVE_REA
207a0 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44  DLINE || HAVE_ED
207b0 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61  ITLINE./*.** Rea
207c0 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  dline completion
207d0 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74   callbacks.*/.st
207e0 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 6c  atic char *readl
207f0 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67  ine_completion_g
20800 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20 63  enerator(const c
20810 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20 73  har *text, int s
20820 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20  tate){.  static 
20830 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
20840 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
20850 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74 61  *zRet;.  if( sta
20860 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  te==0 ){.    cha
20870 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c  r *zSql;.    sql
20880 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
20890 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  tmt);.    zSql =
208a0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
208b0 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  ("SELECT DISTINC
208c0 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c  T candidate COLL
208d0 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20  ATE nocase".    
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63         "  FROM c
20900 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52  ompletion(%Q) OR
20910 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74 29  DER BY 1", text)
20920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72  ;.    sqlite3_pr
20930 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
20940 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
20950 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
20960 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
20970 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
20980 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
20990 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
209a0 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70 28    zRet = strdup(
209b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
209c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
209d0 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d  (pStmt, 0));.  }
209e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
209f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
20a00 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30  );.    pStmt = 0
20a10 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a  ;.    zRet = 0;.
20a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
20a30 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72  t;.}.static char
20a40 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70   **readline_comp
20a50 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
20a60 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 53  r *zText, int iS
20a70 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b  tart, int iEnd){
20a80 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f  .  rl_attempted_
20a90 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20  completion_over 
20aa0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c  = 1;.  return rl
20ab0 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63  _completion_matc
20ac0 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64 6c  hes(zText, readl
20ad0 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67  ine_completion_g
20ae0 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65  enerator);.}..#e
20af0 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49  lif HAVE_LINENOI
20b00 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69  SE./*.** Linenoi
20b10 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61  se completion ca
20b20 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  llback.*/.static
20b30 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f   void linenoise_
20b40 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
20b50 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69   char *zLine, li
20b60 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f  nenoiseCompletio
20b70 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e  ns *lc){.  int n
20b80 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Line = strlen30(
20b90 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c  zLine);.  int i,
20ba0 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74   iStart;.  sqlit
20bb0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
20bc0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
20bd0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
20be0 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e  00];..  if( nLin
20bf0 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33  e>sizeof(zBuf)-3
20c00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
20c10 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20  ( zLine[0]=='.' 
20c20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27  || zLine[0]=='#'
20c30 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
20c40 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20  i=nLine-1; i>=0 
20c50 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e  && (isalnum(zLin
20c60 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69  e[i]) || zLine[i
20c70 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a  ]=='_'); i--){}.
20c80 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31    if( i==nLine-1
20c90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74   ) return;.  iSt
20ca0 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d  art = i+1;.  mem
20cb0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
20cc0 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c   iStart);.  zSql
20cd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
20ce0 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49  tf("SELECT DISTI
20cf0 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f  NCT candidate CO
20d00 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63         "  FROM c
20d30 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29  ompletion(%Q,%Q)
20d40 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20   ORDER BY 1",.  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53         &zLine[iS
20d70 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20  tart], zLine);. 
20d80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
20d90 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53  _v2(globalDb, zS
20da0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
20db0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
20dc0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  ee(zSql);.  sqli
20dd0 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44  te3_exec(globalD
20de0 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  b, "PRAGMA page_
20df0 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29  count", 0, 0, 0)
20e00 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63  ; /* Load the sc
20e10 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28  hema */.  while(
20e20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
20e30 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
20e40 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
20e50 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20  ar *zCompletion 
20e60 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
20e70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
20e80 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
20e90 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f    int nCompletio
20ea0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
20eb0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
20ec0 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61  0);.    if( iSta
20ed0 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c  rt+nCompletion <
20ee0 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20   sizeof(zBuf)-1 
20ef0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
20f00 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f  zBuf+iStart, zCo
20f10 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c  mpletion, nCompl
20f20 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20  etion+1);.      
20f30 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70  linenoiseAddComp
20f40 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29  letion(lc, zBuf)
20f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20f60 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20f70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Stmt);.}.#endif.
20f80 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67  ./*.** Do C-lang
20f90 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f  uage style dequo
20fa0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c  ting..**.**    \
20fb0 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a  a    -> alarm.**
20fc0 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63      \b    -> bac
20fd0 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20  kspace.**    \t 
20fe0 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20     -> tab.**    
20ff0 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65  \n    -> newline
21000 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20  .**    \v    -> 
21010 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20  vertical tab.** 
21020 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d     \f    -> form
21030 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20   feed.**    \r  
21040 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65    -> carriage re
21050 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20  turn.**    \s   
21060 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20   -> space.**    
21070 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20  \"    -> ".**   
21080 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20   \'    -> '.**  
21090 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73    \\    -> backs
210a0 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20  lash.**    \NNN 
210b0 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63   -> ascii charac
210c0 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c  ter NNN in octal
210d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
210e0 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
210f0 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  hes(char *z){.  
21100 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
21110 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   c;.  while( *z 
21120 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b  && *z!='\\' ) z+
21130 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
21140 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
21150 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
21160 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69  ( c=='\\' && z[i
21170 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  +1]!=0 ){.      
21180 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20  c = z[++i];.    
21190 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a    if( c=='a' ){.
211a0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27          c = '\a'
211b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
211c0 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20  ( c=='b' ){.    
211d0 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20      c = '\b';.  
211e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
211f0 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='t' ){.        
21200 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20  c = '\t';.      
21210 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27  }else if( c=='n'
21220 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21230 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\n';.      }els
21240 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a  e if( c=='v' ){.
21250 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27          c = '\v'
21260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21270 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
21280 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20      c = '\f';.  
21290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
212a0 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='r' ){.        
212b0 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
212c0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
212d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
212e0 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  '"';.      }else
212f0 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a   if( c=='\'' ){.
21300 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27          c = '\''
21310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21320 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
21330 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20       c = '\\';. 
21340 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
21350 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20  >='0' && c<='7' 
21360 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20  ){.        c -= 
21370 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  '0';.        if(
21380 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
21390 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
213a0 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
213b0 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
213c0 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
213d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
213e0 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
213f0 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
21400 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
21410 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
21420 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
21430 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
21440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21450 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
21460 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a  = c;.  }.  if( j
21470 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d  <i ) z[j] = 0;.}
21480 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
21490 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72  t zArg as either
214a0 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61   an integer or a
214b0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
214c0 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a   Return 1 or 0.*
214d0 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46  * for TRUE and F
214e0 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68  ALSE.  Return th
214f0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
21500 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
21510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
21520 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74  oleanValue(const
21530 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
21540 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72  int i;.  if( zAr
21550 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
21560 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
21570 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67   for(i=2; hexDig
21580 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29  itValue(zArg[i])
21590 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65  >=0; i++){}.  }e
215a0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
215b0 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
215c0 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
215d0 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28  i++){}.  }.  if(
215e0 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d   i>0 && zArg[i]=
215f0 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74  =0 ) return (int
21600 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  )(integerValue(z
21610 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66  Arg) & 0xfffffff
21620 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f);.  if( sqlite
21630 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
21640 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
21650 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
21660 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
21670 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
21680 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
21690 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
216a0 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
216b0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
216c0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
216d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74  turn 0;.  }.  ut
216e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
216f0 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20  , "ERROR: Not a 
21700 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c  boolean value: \
21710 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20  "%s\". Assuming 
21720 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"no\".\n",.    
21730 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72        zArg);.  r
21740 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21750 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
21760 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f   shell flag acco
21770 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65  rding to a boole
21780 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
21790 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c  tic void setOrCl
217a0 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61  earFlag(ShellSta
217b0 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  te *p, unsigned 
217c0 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61  mFlag, const cha
217d0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20  r *zArg){.  if( 
217e0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72  booleanValue(zAr
217f0 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  g) ){.    ShellS
21800 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  etFlag(p, mFlag)
21810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
21820 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
21830 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a   mFlag);.  }.}..
21840 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
21850 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
21860 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
21870 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
21880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
21890 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
218a0 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
218b0 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
218c0 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
218d0 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
218e0 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
218f0 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
21900 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
21910 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
21920 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
21930 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
21940 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
21950 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
21960 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69  the output.** fi
21970 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e  lename is "off".
21980 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .*/.static FILE 
21990 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65  *output_file_ope
219a0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
219b0 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f  ile, int bTextMo
219c0 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a  de){.  FILE *f;.
219d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
219e0 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  le,"stdout")==0 
219f0 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75  ){.    f = stdou
21a00 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  t;.  }else if( s
21a10 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74  trcmp(zFile, "st
21a20 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  derr")==0 ){.   
21a30 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d   f = stderr;.  }
21a40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
21a50 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30  zFile, "off")==0
21a60 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20   ){.    f = 0;. 
21a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20   }else{.    f = 
21a80 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65  fopen(zFile, bTe
21a90 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20 22  xtMode ? "w" : "
21aa0 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d  wb");.    if( f=
21ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
21ac0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21ad0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
21ae0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
21af0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
21b00 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a  .  return f;.}..
21b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b20 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
21b30 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
21b40 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
21b50 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
21b60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
21b70 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c  t sql_trace_call
21b80 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64  back(.  unsigned
21b90 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   mType,         
21ba0 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79 70  /* The trace typ
21bb0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  e */.  void *pAr
21bc0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g,             /
21bd0 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74 65  * The ShellState
21be0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f   pointer */.  vo
21bf0 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20 20  id *pP,         
21c00 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c 79        /* Usually
21c10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 71   a pointer to sq
21c20 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20 76  lite_stmt */.  v
21c30 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20 20  oid *pX         
21c40 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c 69         /* Auxili
21c50 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b  ary output */.){
21c60 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
21c70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
21c80 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
21c90 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
21ca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
21cb0 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20 69  .  int nSql;.  i
21cc0 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d  f( p->traceOut==
21cd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21ce0 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49 54  if( mType==SQLIT
21cf0 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b  E_TRACE_CLOSE ){
21d00 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
21d10 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 2d  (p->traceOut, "-
21d20 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61  - closing databa
21d30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22  se connection\n"
21d40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
21d50 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70 65  .  }.  if( mType
21d60 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52  !=SQLITE_TRACE_R
21d70 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63 68  OW && ((const ch
21d80 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27 20  ar*)pX)[0]=='-' 
21d90 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28 63  ){.    zSql = (c
21da0 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20  onst char*)pX;. 
21db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d   }else{.    pStm
21dc0 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
21dd0 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74 63  t*)pP;.    switc
21de0 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70 65  h( p->eTraceType
21df0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
21e00 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e  HELL_TRACE_EXPAN
21e10 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  DED: {.        z
21e20 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Sql = sqlite3_ex
21e30 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74  panded_sql(pStmt
21e40 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21e50 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
21e60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
21e70 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 63  ORMALIZE.      c
21e80 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f  ase SHELL_TRACE_
21e90 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  NORMALIZED: {.  
21ea0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
21eb0 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f  ite3_normalized_
21ec0 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
21ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21ee0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21ef0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
21f00 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
21f10 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
21f20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21f40 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
21f50 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c 20  eturn 0;.  nSql 
21f60 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
21f70 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c 3e  ;.  while( nSql>
21f80 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31  0 && zSql[nSql-1
21f90 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d  ]==';' ){ nSql--
21fa0 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d 54  ; }.  switch( mT
21fb0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
21fc0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
21fd0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
21fe0 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a  E_TRACE_STMT: {.
21ff0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
22000 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
22010 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20  %.*s;\n", nSql, 
22020 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  zSql);.      bre
22030 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22040 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
22050 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  PROFILE: {.     
22060 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
22070 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c 69  Nanosec = *(sqli
22080 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a 20  te3_int64*)pX;. 
22090 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
220a0 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25  (p->traceOut, "%
220b0 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c  .*s; -- %lld ns\
220c0 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20  n", nSql, zSql, 
220d0 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20 20  nNanosec);.     
220e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
220f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22100 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
22110 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
22120 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
22130 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
22140 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
22150 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
22160 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
22170 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
22180 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
22190 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
221a0 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
221b0 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
221c0 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
221d0 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
221e0 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
221f0 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c  SV and other fil
22200 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a  es for import..*
22210 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
22220 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72   ImportCtx Impor
22230 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70  tCtx;.struct Imp
22240 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74  ortCtx {.  const
22250 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f   char *zFile;  /
22260 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
22270 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49  put file */.  FI
22280 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
22290 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53    /* Read the CS
222a0 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73  V text from this
222b0 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
222c0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
222d0 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
222e0 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61  lated text for a
222f0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
22300 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
22310 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22320 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74  es in z */.  int
22330 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
22340 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
22350 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20  ted for z[] */. 
22360 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
22370 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
22380 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
22390 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20   int bNotFirst; 
223a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
223b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  one or more byte
223c0 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a  s already read *
223d0 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
223e0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
223f0 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
22400 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
22410 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
22420 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20  int cColSep;    
22430 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
22440 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
22450 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79  acter.  (Usually
22460 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63   ",") */.  int c
22470 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f  RowSep;        /
22480 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61  * The row separa
22490 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20  tor character.  
224a0 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a  (Usually "\n") *
224b0 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
224c0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
224d0 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
224e0 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e  oid import_appen
224f0 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78  d_char(ImportCtx
22500 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69   *p, int c){.  i
22510 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41  f( p->n+1>=p->nA
22520 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
22530 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c  Alloc += p->nAll
22540 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d  oc + 100;.    p-
22550 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  >z = sqlite3_rea
22560 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e  lloc64(p->z, p->
22570 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
22580 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c   p->z==0 ) shell
22590 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
225a0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  ;.  }.  p->z[p->
225b0 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  n++] = (char)c;.
225c0 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
225d0 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56  gle field of CSV
225e0 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62   text.  Compatib
225f0 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30 20  le with rfc4180 
22600 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20  and extended.** 
22610 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20  with the option 
22620 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70 61  of having a sepa
22630 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
22640 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20   ","..**.**   + 
22650 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
22660 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
22670 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
22680 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
22690 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
226a0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
226b0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
226c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
226d0 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
226e0 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
226f0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
22700 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
22710 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ,"..**   +  Use 
22720 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
22730 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
22740 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
22750 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70  n"..**   +  Keep
22760 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
22770 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ne number in p->
22780 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
22790 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
227a0 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
227b0 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
227c0 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
227d0 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
227e0 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
227f0 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
22800 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
22810 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
22820 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
22830 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
22840 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
22850 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
22860 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
22870 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
22880 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
22890 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
228a0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
228b0 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
228c0 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
228d0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
228e0 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
228f0 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22  .  }.  if( c=='"
22900 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c  ' ){.    int pc,
22910 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74   ppc;.    int st
22920 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
22930 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
22940 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
22950 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
22960 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
22970 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
22980 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72  ;.      if( c==r
22990 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  Sep ) p->nLine++
229a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
229b0 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
229c0 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
229d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
229e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
229f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22a00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22a10 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
22a20 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
22a30 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
22a40 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
22a50 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65        || (c==rSe
22a60 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  p && pc=='\r' &&
22a70 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
22a80 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
22a90 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
22aa0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22ab0 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
22ac0 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
22ad0 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
22ae0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
22af0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22b10 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
22b20 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
22b30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
22b40 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
22b50 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61  escaped %c chara
22b60 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  cter\n",.       
22b70 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c           p->zFil
22b80 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75  e, p->nLine, cQu
22b90 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ote);.      }.  
22ba0 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29      if( c==EOF )
22bb0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
22bc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
22bd0 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74  s:%d: unterminat
22be0 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65  ed %c-quoted fie
22bf0 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
22c00 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
22c10 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f   startLine, cQuo
22c20 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  te);.        p->
22c30 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
22c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22c50 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  }.      import_a
22c60 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
22c70 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70 63  ;.      ppc = pc
22c80 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a  ;.      pc = c;.
22c90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
22ca0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
22cb0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
22cc0 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e   being parsed an
22cd0 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74 68  d it begins with
22ce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d   the.    ** UTF-
22cf0 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20  8 BOM  (0xEF BB 
22d00 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  BF) then skip th
22d10 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28  e BOM */.    if(
22d20 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20   (c&0xff)==0xef 
22d30 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d  && p->bNotFirst=
22d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  =0 ){.      impo
22d50 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
22d60 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
22d70 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
22d80 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
22d90 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20  ==0xbb ){.      
22da0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
22db0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
22dc0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
22dd0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >in);.        if
22de0 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66  ( (c&0xff)==0xbf
22df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
22e00 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
22e10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d            p->n =
22e20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
22e30 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e  turn csv_read_on
22e40 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20  e_field(p);.    
22e50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22e60 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63    }.    while( c
22e70 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70  !=EOF && c!=cSep
22e80 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20   && c!=rSep ){. 
22e90 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
22ea0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
22eb0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
22ec0 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->in);.    }.   
22ed0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
22ee0 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b        p->nLine++
22ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
22f00 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d  >0 && p->z[p->n-
22f10 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d  1]=='\r' ) p->n-
22f20 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  -;.    }.    p->
22f30 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20  cTerm = c;.  }. 
22f40 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a   if( p->z ) p->z
22f50 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d  [p->n] = 0;.  p-
22f60 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
22f70 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
22f80 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
22f90 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49  le field of ASCI
22fa0 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74  I delimited text
22fb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
22fc0 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
22fd0 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
22fe0 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
22ff0 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
23000 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
23010 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
23020 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
23030 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
23040 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
23050 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
23060 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
23070 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46  default is "\x1F
23080 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
23090 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
230a0 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
230b0 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78  e default is "\x
230c0 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  1E"..**   +  Kee
230d0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72  p track of the r
230e0 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ow number in p->
230f0 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
23100 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
23110 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
23120 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
23130 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
23140 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
23150 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
23160 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
23170 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
23180 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
23190 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
231a0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
231b0 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20  field(ImportCtx 
231c0 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *p){.  int c;.  
231d0 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43  int cSep = p->cC
231e0 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65  olSep;.  int rSe
231f0 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a  p = p->cRowSep;.
23200 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20    p->n = 0;.  c 
23210 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
23220 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20    if( c==EOF || 
23230 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
23240 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
23250 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EOF;.    return 
23260 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
23270 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
23280 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
23290 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
232a0 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
232b0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
232c0 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  n);.  }.  if( c=
232d0 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e  =rSep ){.    p->
232e0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70  nLine++;.  }.  p
232f0 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69  ->cTerm = c;.  i
23300 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
23310 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  ->n] = 0;.  retu
23320 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn p->z;.}../*.*
23330 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
23340 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  r data for table
23350 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20   zTable.  If an 
23360 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68  error is seen wh
23370 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f  ile.** moving fo
23380 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f  rward, try to go
23390 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65   backwards.  The
233a0 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d   backwards movem
233b0 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72  ent won't.** wor
233c0 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  k for WITHOUT RO
233d0 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  WID tables..*/.s
233e0 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
233f0 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65  CloneData(.  She
23400 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
23410 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
23420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
23430 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  le.){.  sqlite3_
23440 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
23450 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
23460 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
23470 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
23480 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
23490 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
234a0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
234b0 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
234c0 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29  strlen30(zTable)
234d0 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20  ;.  int k = 0;. 
234e0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
234f0 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61  const int spinRa
23500 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a  te = 10000;..  z
23510 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
23520 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
23530 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20  * FROM \"%w\"", 
23540 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20  zTable);.  rc = 
23550 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
23560 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
23570 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
23580 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23590 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
235a0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64  tderr, "Error %d
235b0 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  : %s on [%s]\n",
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
235d0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
235e0 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
235f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
23600 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
23610 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f   zQuery);.    go
23620 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  to end_data_xfer
23630 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69  ;.  }.  n = sqli
23640 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
23650 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73  (pQuery);.  zIns
23660 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ert = sqlite3_ma
23670 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61  lloc64(200 + nTa
23680 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66  ble + n*3);.  if
23690 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73  ( zInsert==0 ) s
236a0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
236b0 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ry();.  sqlite3_
236c0 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61  snprintf(200+nTa
236d0 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20  ble,zInsert,.   
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
23700 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41  E INTO \"%s\" VA
23710 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29  LUES(?", zTable)
23720 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30  ;.  i = strlen30
23730 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72  (zInsert);.  for
23740 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=1; j<n; j++){
23750 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73  .    memcpy(zIns
23760 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b  ert+i, ",?", 2);
23770 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d  .    i += 2;.  }
23780 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72  .  memcpy(zInser
23790 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20  t+i, ");", 3);. 
237a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
237b0 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20  epare_v2(newDb, 
237c0 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49  zInsert, -1, &pI
237d0 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28  nsert, 0);.  if(
237e0 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
237f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23800 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20  Error %d: %s on 
23810 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
23820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74       sqlite3_ext
23830 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65  ended_errcode(ne
23840 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  wDb), sqlite3_er
23850 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20  rmsg(newDb),.   
23860 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
23870 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64  ;.    goto end_d
23880 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ata_xfer;.  }.  
23890 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b  for(k=0; k<2; k+
238a0 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +){.    while( (
238b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
238c0 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
238d0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
238e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
238f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74  +){.        swit
23900 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
23910 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20  mn_type(pQuery, 
23920 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i) ){.          
23930 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
23940 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
23950 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
23960 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b  l(pInsert, i+1);
23970 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23980 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
23990 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
239a0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
239b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
239c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
239d0 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
239e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
239f0 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20  64(pQuery,i));. 
23a00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
23a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23a20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
23a30 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
23a40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23a50 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e  _bind_double(pIn
23a60 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
23a70 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
23a80 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
23a90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23aa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23ab0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
23ac0 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20  E_TEXT: {.      
23ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
23ae0 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c  nd_text(pInsert,
23af0 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20   i+1,.          
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29     (const char*)
23b20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
23b30 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  ext(pQuery,i),. 
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
23b60 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
23b70 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23b80 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
23b90 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
23ba0 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
23bb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23bc0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65  _bind_blob(pInse
23bd0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
23be0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75  _column_blob(pQu
23bf0 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
23c30 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c  mn_bytes(pQuery,
23c40 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
23c80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23c90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
23ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23cb0 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20   /* End for */. 
23cc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23cd0 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b  3_step(pInsert);
23ce0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23cf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
23d00 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63  SQLITE_ROW && rc
23d10 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  !=SQLITE_DONE ){
23d20 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
23d30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
23d40 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73  ror %d: %s\n", s
23d50 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
23d60 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a  errcode(newDb),.
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23d90 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a  errmsg(newDb));.
23da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
23db0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73  lite3_reset(pIns
23dc0 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b  ert);.      cnt+
23dd0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e  +;.      if( (cn
23de0 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29  t%spinRate)==0 )
23df0 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
23e00 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22  ("%c\b", "|/-\\"
23e10 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25  [(cnt/spinRate)%
23e20 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c  4]);.        ffl
23e30 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
23e40 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e     }.    } /* En
23e50 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69  d while */.    i
23e60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
23e70 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  NE ) break;.    
23e80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
23e90 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
23ea0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
23eb0 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
23ec0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23ed0 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
23ee0 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20  \"%w\" ORDER BY 
23ef0 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20  rowid DESC;",.  
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c             zTabl
23f20 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
23f30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
23f40 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
23f50 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
23f60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
23f70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23f80 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67  stderr, "Warning
23f90 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22  : cannot step \"
23fa0 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c  %s\" backwards",
23fb0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
23fc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
23fd0 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e   /* End for(k=0.
23fe0 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61  ..) */..end_data
23ff0 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33  _xfer:.  sqlite3
24000 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
24010 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
24020 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a  alize(pInsert);.
24030 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24040 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65  Query);.  sqlite
24050 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b  3_free(zInsert);
24060 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
24070 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72  o transfer all r
24080 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d  ows of the schem
24090 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68  a that match zWh
240a0 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63  ere.  For.** eac
240b0 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46  h row, invoke xF
240c0 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20  orEach() on the 
240d0 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62  object defined b
240e0 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49  y that row..** I
240f0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
24100 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
24110 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74  moving forward t
24120 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71  hrough the.** sq
24130 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
24140 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76  e, try again mov
24150 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a  ing backwards..*
24160 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
24170 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a  yToCloneSchema(.
24180 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
24190 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
241a0 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
241b0 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20  *zWhere,.  void 
241c0 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c  (*xForEach)(Shel
241d0 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a  lState*,sqlite3*
241e0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
241f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24200 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63  *pQuery = 0;.  c
24210 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
24220 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
24230 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
24240 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74   *zName;.  const
24250 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
24260 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zSql;.  char *zE
24270 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51  rrMsg = 0;..  zQ
24280 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
24290 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e  printf("SELECT n
242a0 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ame, sql FROM sq
242b0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
242e0 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  %s", zWhere);.  
242f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
24300 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
24310 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
24320 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
24330 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
24340 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
24350 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
24360 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
24370 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24380 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
24390 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
243a0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
243b0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
243c0 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
243d0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63  .    goto end_sc
243e0 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  hema_xfer;.  }. 
243f0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
24400 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
24410 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
24420 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
24430 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
24440 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  xt(pQuery, 0);. 
24450 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
24460 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
24470 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72  uery, 1);.    pr
24480 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
24490 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
244a0 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  dout);.    sqlit
244b0 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28  e3_exec(newDb, (
244c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c  const char*)zSql
244d0 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
244e0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
244f0 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
24500 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24510 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a  "Error: %s\nSQL:
24520 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73   [%s]\n", zErrMs
24530 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  g, zSql);.      
24540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
24550 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72  rMsg);.      zEr
24560 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rMsg = 0;.    }.
24570 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68      if( xForEach
24580 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61   ){.      xForEa
24590 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
245a0 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
245b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
245c0 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20  tf("done\n");.  
245d0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
245e0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73  TE_DONE ){.    s
245f0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
24600 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
24610 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
24620 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20  );.    zQuery = 
24630 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
24640 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
24650 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24660 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f 52     " WHERE %s OR
24690 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
246a0 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  C", zWhere);.   
246b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
246c0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
246d0 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
246e0 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ery, 0);.    if(
246f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
24700 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24710 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
24720 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
24750 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
24760 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
24770 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20   zQuery);.      
247a0 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
247b0 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xfer;.    }.    
247c0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
247d0 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79  ite3_step(pQuery
247e0 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ))==SQLITE_ROW )
247f0 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
24800 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24810 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
24820 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
24830 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
24840 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20  (pQuery, 1);.   
24850 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
24860 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
24870 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
24880 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
24890 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
248a0 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  r*)zSql, 0, 0, &
248b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
248c0 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
248d0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
248e0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
248f0 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
24900 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
24910 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ql);.        sql
24920 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
24930 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  g);.        zErr
24940 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Msg = 0;.      }
24950 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72 45  .      if( xForE
24960 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ach ){.        x
24970 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62  ForEach(p, newDb
24980 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
24990 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
249a0 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e       printf("don
249b0 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e\n");.    }.  }
249c0 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72  .end_schema_xfer
249d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
249e0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
249f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
24a00 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ery);.}../*.** O
24a10 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
24a20 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a  se file named "z
24a30 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20  NewDb".  Try to 
24a40 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20  recover as much 
24a50 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61  information.** a
24a60 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f  s possible out o
24a70 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
24a80 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68 74  ase (which might
24a90 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64   be corrupt) and
24aa0 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74   write it.** int
24ab0 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61  o zNewDb..*/.sta
24ac0 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
24ad0 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  one(ShellState *
24ae0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
24af0 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63  NewDb){.  int rc
24b00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ;.  sqlite3 *new
24b10 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63  Db = 0;.  if( ac
24b20 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d  cess(zNewDb,0)==
24b30 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
24b40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69  intf(stderr, "Fi
24b50 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  le \"%s\" alread
24b60 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e  y exists.\n", zN
24b70 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72  ewDb);.    retur
24b80 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  n;.  }.  rc = sq
24b90 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44  lite3_open(zNewD
24ba0 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66  b, &newDb);.  if
24bb0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24bc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24bd0 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f  "Cannot create o
24be0 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a 20  utput database: 
24bf0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
24c00 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
24c10 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c  g(newDb));.  }el
24c20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
24c30 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
24c40 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
24c50 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20  ema=ON;", 0, 0, 
24c60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
24c70 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47  exec(newDb, "BEG
24c80 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20  IN EXCLUSIVE;", 
24c90 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72  0, 0, 0);.    tr
24ca0 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70  yToCloneSchema(p
24cb0 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27  , newDb, "type='
24cc0 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c  table'", tryToCl
24cd0 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72  oneData);.    tr
24ce0 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70  yToCloneSchema(p
24cf0 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d  , newDb, "type!=
24d00 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20  'table'", 0);.  
24d10 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
24d20 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c  ewDb, "COMMIT;",
24d30 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
24d40 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
24d50 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
24d60 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
24d70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
24d80 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62    close_db(newDb
24d90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
24da0 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
24db0 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
24dc0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
24dd0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61  p->doXdgOpen fla
24de0 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d  g is set, that m
24df0 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20  eans the output 
24e00 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64  was being.** red
24e10 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d  irected to a tem
24e20 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
24e30 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  d by p->zTempFil
24e40 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
24e50 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72  ,.** launch star
24e60 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
24e70 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
24e80 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  y file..*/.stati
24e90 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
24ea0 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
24eb0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
24ec0 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
24ed0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24ee0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
24ef0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
24f00 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
24f10 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
24f20 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66  ose(p->out);.#if
24f30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
24f40 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
24f50 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
24f60 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
24f70 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20  ar *zXdgOpenCmd 
24f80 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  =.#if defined(_W
24f90 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74 61  IN32).      "sta
24fa0 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  rt";.#elif defin
24fb0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
24fc0 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73      "open";.#els
24fd0 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65  e.      "xdg-ope
24fe0 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  n";.#endif.     
24ff0 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
25000 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
25010 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73  3_mprintf("%s %s
25020 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20  ", zXdgOpenCmd, 
25030 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
25040 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d 28       if( system(
25050 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20  zCmd) ){.       
25060 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25070 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25  err, "Failed: [%
25080 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20  s]\n", zCmd);.  
25090 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
250a0 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
250b0 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
250c0 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  Pop(p);.      p-
250d0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a  >doXdgOpen = 0;.
250e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
250f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25100 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a  NOHAVE_SYSTEM) *
25110 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69  /.  }.  p->outfi
25120 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e  le[0] = 0;.  p->
25130 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a  out = stdout;.}.
25140 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51  ./*.** Run an SQ
25150 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  L command and re
25160 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  turn the single 
25170 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a  integer result..
25180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
25190 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20  _int(ShellState 
251a0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
251b0 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  zSql){.  sqlite3
251c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
251d0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73  int res = 0;.  s
251e0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
251f0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
25200 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
25210 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
25220 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
25230 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
25240 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
25250 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
25260 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71  tmt,0);.  }.  sq
25270 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
25280 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Stmt);.  return 
25290 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  res;.}../*.** Co
252a0 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f  nvert a 2-byte o
252b0 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  r 4-byte big-end
252c0 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  ian integer into
252d0 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65   a native intege
252e0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  r.*/.static unsi
252f0 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79 74  gned int get2byt
25300 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
25310 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
25320 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31   (a[0]<<8) + a[1
25330 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69  ];.}.static unsi
25340 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79 74  gned int get4byt
25350 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
25360 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
25370 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61   (a[0]<<24) + (a
25380 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d  [1]<<16) + (a[2]
25390 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a  <<8) + a[3];.}..
253a0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
253b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e  tion of the ".in
253c0 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  fo" command..**.
253d0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
253e0 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
253f0 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
25400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25410 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
25420 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20  mand(ShellState 
25430 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  *p, int nArg, ch
25440 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73  ar **azArg){.  s
25450 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
25460 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20  ct { const char 
25470 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74  *zName; int ofst
25480 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b  ; } aField[] = {
25490 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68  .     { "file ch
254a0 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20  ange counter:", 
254b0 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   24  },.     { "
254c0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
254d0 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20  unt:",  28  },. 
254e0 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20      { "freelist 
254f0 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33  page count:",  3
25500 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  6  },.     { "sc
25510 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20  hema cookie:",  
25520 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20        40  },.   
25530 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d    { "schema form
25540 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20  at:",        44 
25550 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61   },.     { "defa
25560 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22  ult cache size:"
25570 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20  ,   48  },.     
25580 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f  { "autovacuum to
25590 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d  p root:",  52  }
255a0 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d  ,.     { "increm
255b0 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20  ental vacuum:", 
255c0 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    64  },.     { 
255d0 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22  "text encoding:"
255e0 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a  ,        56  },.
255f0 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65 72       { "user ver
25600 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20  sion:",         
25610 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  60  },.     { "a
25620 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c  pplication id:",
25630 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20         68  },.  
25640 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76     { "software v
25650 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36  ersion:",     96
25660 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
25670 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
25680 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
25690 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20  ame; const char 
256a0 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b  *zSql; } aQuery[
256b0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75  ] = {.     { "nu
256c0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22  mber of tables:"
256d0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
256e0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
256f0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  s WHERE type='ta
25700 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ble'" },.     { 
25710 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78  "number of index
25720 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
25730 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
25740 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
25750 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20  ='index'" },.   
25760 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74    { "number of t
25770 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20  riggers:",.     
25780 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
25790 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
257a0 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 22   type='trigger'"
257b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
257c0 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20  er of views:",. 
257d0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
257e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
257f0 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77 27  HERE type='view'
25800 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68  " },.     { "sch
25810 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20  ema size:",.    
25820 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c     "SELECT total
25830 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52  (length(sql)) FR
25840 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20  OM %s" },.  };. 
25850 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75 6e   int i, rc;.  un
25860 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72 73  signed iDataVers
25870 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63  ion;.  char *zSc
25880 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20  hemaTab;.  char 
25890 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  *zDb = nArg>=2 ?
258a0 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69   azArg[1] : "mai
258b0 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  n";.  sqlite3_st
258c0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
258d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
258e0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e  Hdr[100];.  open
258f0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  _db(p, 0);.  if(
25900 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75   p->db==0 ) retu
25910 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c  rn 1;.  rc = sql
25920 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
25930 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
25940 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 61      "SELECT data
25950 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
25960 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70 67  age(?1) WHERE pg
25970 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  no=1",.         
25980 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
25990 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
259a0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
259b0 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
259c0 73 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50 41  sed("ENABLE_DBPA
259d0 47 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20 20  GE_VTAB") ){.   
259e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
259f0 74 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e 64  tderr, "the \".d
25a00 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64 20  binfo\" command 
25a10 72 65 71 75 69 72 65 73 20 74 68 65 20 22 0a 20  requires the ". 
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c 49           "-DSQLI
25a40 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  TE_ENABLE_DBPAGE
25a50 5f 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74 69  _VTAB compile-ti
25a60 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b 0a  me options\n");.
25a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25a80 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25a90 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73 5c  err, "error: %s\
25aa0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
25ab0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
25ac0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
25ad0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
25ae0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
25af0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
25b00 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
25b10 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  Db, -1, SQLITE_S
25b20 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71  TATIC);.  if( sq
25b30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
25b40 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
25b50 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   && sqlite3_colu
25b60 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30  mn_bytes(pStmt,0
25b70 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d  )>100.  ){.    m
25b80 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69  emcpy(aHdr, sqli
25b90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
25ba0 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a  pStmt,0), 100);.
25bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
25bc0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
25bd0 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
25be0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
25bf0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74  able to read dat
25c00 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29  abase header\n")
25c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
25c20 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
25c30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
25c40 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 49  .  i = get2byteI
25c50 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69  nt(aHdr+16);.  i
25c60 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35  f( i==1 ) i = 65
25c70 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  536;.  utf8_prin
25c80 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
25c90 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61  s %d\n", "databa
25ca0 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20  se page size:", 
25cb0 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  i);.  utf8_print
25cc0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
25cd0 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66   %d\n", "write f
25ce0 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38  ormat:", aHdr[18
25cf0 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
25d00 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
25d10 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f   %d\n", "read fo
25d20 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d  rmat:", aHdr[19]
25d30 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
25d40 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
25d50 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64  %d\n", "reserved
25d60 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32   bytes:", aHdr[2
25d70 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
25d80 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69 65  i<ArraySize(aFie
25d90 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ld); i++){.    i
25da0 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64  nt ofst = aField
25db0 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e  [i].ofst;.    un
25dc0 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d  signed int val =
25dd0 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48 64   get4byteInt(aHd
25de0 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75  r + ofst);.    u
25df0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
25e00 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61  t, "%-20s %u", a
25e10 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Field[i].zName, 
25e20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68  val);.    switch
25e30 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20  ( ofst ){.      
25e40 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20  case 56: {.     
25e50 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20     if( val==1 ) 
25e60 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
25e70 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20  t, " (utf8)");. 
25e80 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
25e90 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  2 ) raw_printf(p
25ea0 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c  ->out, " (utf16l
25eb0 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e)");.        if
25ec0 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70  ( val==3 ) raw_p
25ed0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
25ee0 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20  (utf16be)");.   
25ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
25f00 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
25f10 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  , "\n");.  }.  i
25f20 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
25f30 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
25f40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
25f50 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
25f60 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  r");.  }else if(
25f70 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d   strcmp(zDb,"tem
25f80 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  p")==0 ){.    zS
25f90 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
25fa0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
25fb0 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
25fc0 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  ster");.  }else{
25fd0 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
25fe0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
25ff0 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  f("\"%w\".sqlite
26000 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a  _master", zDb);.
26010 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
26020 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65 72  <ArraySize(aQuer
26030 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  y); i++){.    ch
26040 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
26050 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72  e3_mprintf(aQuer
26060 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65  y[i].zSql, zSche
26070 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20  maTab);.    int 
26080 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20  val = db_int(p, 
26090 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSql);.    sqlit
260a0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
260b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
260c0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
260d0 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a  \n", aQuery[i].z
260e0 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a  Name, val);.  }.
260f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26100 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73 71  SchemaTab);.  sq
26110 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
26120 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53  ol(p->db, zDb, S
26130 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41  QLITE_FCNTL_DATA
26140 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74 61  _VERSION, &iData
26150 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38  Version);.  utf8
26160 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26170 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22 64  "%-20s %u\n", "d
26180 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69 44  ata version", iD
26190 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72  ataVersion);.  r
261a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
261b0 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72  * Print the curr
261c0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ent sqlite3_errm
261d0 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74  sg() value to st
261e0 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
261f0 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
26200 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
26210 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ror(sqlite3 *db)
26220 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
26230 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
26240 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66  rrmsg(db);.  utf
26250 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
26260 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
26270 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  zErr);.  return 
26280 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
26290 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e 20  are the pattern 
262a0 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e  in zGlob[] again
262b0 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a  st the text in z
262c0 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  [].  Return TRUE
262d0 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63  .** if they matc
262e0 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20  h and FALSE (0) 
262f0 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  if they do not m
26300 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  atch..**.** Glob
26310 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
26320 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
26330 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
26340 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
26350 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
26360 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
26370 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
26380 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
26390 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
263a0 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
263b0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
263c0 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
263d0 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
263f0 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
26400 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
26410 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
26420 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
26430 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
26440 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20 20  .**      '#'    
26450 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
26460 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f  equence of one o
26470 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69  r more digits wi
26480 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  th an.**        
26490 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c          optional
264a0 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20   + or - sign in 
264b0 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  front.**.**     
264c0 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20 73   ' '       Any s
264d0 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63  pan of whitespac
264e0 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74  e matches any ot
264f0 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20  her span of.**  
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
26510 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  itespace..**.** 
26520 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63 65  Extra whitespace
26530 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a   at the end of z
26540 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  [] is ignored..*
26550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
26560 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74  tcase_glob(const
26570 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f   char *zGlob, co
26580 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
26590 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74  int c, c2;.  int
265a0 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
265b0 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  een;..  while( (
265c0 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29  c = (*(zGlob++))
265d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
265e0 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
265f0 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63 65      if( !IsSpace
26600 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
26610 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
26620 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20  Space(*zGlob) ) 
26630 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77  zGlob++;.      w
26640 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
26650 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c  ) ) z++;.    }el
26660 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b  se if( c=='*' ){
26670 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
26680 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d  =(*(zGlob++))) =
26690 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  = '*' || c=='?' 
266a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
266b0 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29  =='?' && (*(z++)
266c0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
266d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
266e0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
266f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
26700 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
26710 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '[' ){.        w
26720 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74  hile( *z && test
26730 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d  case_glob(zGlob-
26740 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1,z)==0 ){.     
26750 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
26760 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
26770 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20  rn (*z)!=0;.    
26780 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
26790 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29   (c2 = (*(z++)))
267a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  !=0 ){.        w
267b0 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20  hile( c2!=c ){. 
267c0 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
267d0 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  z++);.          
267e0 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
267f0 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
26800 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
26810 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c  case_glob(zGlob,
26820 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  z) ) return 1;. 
26830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
26840 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
26850 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20   if( c=='?' ){. 
26860 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29       if( (*(z++)
26870 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
26880 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
26890 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69  =='[' ){.      i
268a0 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  nt prior_c = 0;.
268b0 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a        seen = 0;.
268c0 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
268d0 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b  ;.      c = *(z+
268e0 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +);.      if( c=
268f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26900 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
26910 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  b++);.      if( 
26920 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20  c2=='^' ){.     
26930 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
26940 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
26950 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
26960 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d        if( c2==']
26970 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
26980 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
26990 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
269a0 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
269b0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
269c0 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20  ( c2 && c2!=']' 
269d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
269e0 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b  2=='-' && zGlob[
269f0 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62  0]!=']' && zGlob
26a00 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [0]!=0 && prior_
26a10 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
26a20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
26a30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26a40 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c  c>=prior_c && c<
26a50 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  =c2 ) seen = 1;.
26a60 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
26a70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
26a80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26a90 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
26aa0 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
26ab0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
26ac0 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
26ad0 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d   = c2;.        }
26ae0 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
26af0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
26b00 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
26b10 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76  0 || (seen ^ inv
26b20 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ert)==0 ) return
26b30 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
26b40 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20  ( c=='#' ){.    
26b50 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27    if( (z[0]=='-'
26b60 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26   || z[0]=='+') &
26b70 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20  & IsDigit(z[1]) 
26b80 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
26b90 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20   !IsDigit(z[0]) 
26ba0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26bb0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69    z++;.      whi
26bc0 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d  le( IsDigit(z[0]
26bd0 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
26be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
26bf0 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72   c!=(*(z++)) ) r
26c00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
26c10 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70   }.  while( IsSp
26c20 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  ace(*z) ){ z++; 
26c30 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
26c40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
26c50 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20 61  are the string a
26c60 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  s a command-line
26c70 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74   option with eit
26c80 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a  her one or two.*
26c90 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68  * initial "-" ch
26ca0 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
26cb0 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61  tic int optionMa
26cc0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
26cd0 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
26ce0 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a   *zOpt){.  if( z
26cf0 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65  Str[0]!='-' ) re
26d00 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b  turn 0;.  zStr++
26d10 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d  ;.  if( zStr[0]=
26d20 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20  ='-' ) zStr++;. 
26d30 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a   return strcmp(z
26d40 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d  Str, zOpt)==0;.}
26d50 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
26d60 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68   file..*/.int sh
26d70 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f  ellDeleteFile(co
26d80 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
26d90 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame){.  int rc;.
26da0 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
26db0 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
26dc0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
26dd0 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
26de0 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77  name);.  rc = _w
26df0 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c  unlink(z);.  sql
26e00 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
26e10 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e  lse.  rc = unlin
26e20 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  k(zFilename);.#e
26e30 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
26e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
26e50 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  o delete the tem
26e60 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66 20  porary file (if 
26e70 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61 6e  there is one) an
26e80 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65  d free the.** me
26e90 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f 6c  mory used to hol
26ea0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
26eb0 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a  e temp file..*/.
26ec0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
26ed0 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53  rTempFile(ShellS
26ee0 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  tate *p){.  if( 
26ef0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
26f00 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
26f10 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20 72  p->doXdgOpen ) r
26f20 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65  eturn;.  if( she
26f30 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e  llDeleteFile(p->
26f40 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74  zTempFile) ) ret
26f50 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  urn;.  sqlite3_f
26f60 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ree(p->zTempFile
26f70 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  );.  p->zTempFil
26f80 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
26f90 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d  Create a new tem
26fa0 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68  p file name with
26fb0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
26fc0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
26fd0 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68  d newTempFile(Sh
26fe0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
26ff0 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
27000 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ){.  clearTempFi
27010 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  le(p);.  sqlite3
27020 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
27030 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
27040 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ile = 0;.  if( p
27050 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
27060 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
27070 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54  (p->db, 0, SQLIT
27080 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
27090 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46  NAME, &p->zTempF
270a0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
270b0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
270c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  ){.    sqlite3_u
270d0 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71 6c  int64 r;.    sql
270e0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
270f0 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
27100 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
27110 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
27120 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22  tf("temp%llx.%s"
27130 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20  , r, zSuffix);. 
27140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a   }else{.    p->z
27150 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
27160 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25  e3_mprintf("%z.%
27170 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  s", p->zTempFile
27180 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a  , zSuffix);.  }.
27190 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69    if( p->zTempFi
271a0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  le==0 ){.    raw
271b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
271c0 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
271d0 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
271e0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
271f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
27200 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
27210 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f  function fkey_co
27220 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20  llate_clause(), 
27230 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22  used.** by the "
27240 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
27250 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  es" command. Thi
27260 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  s scalar functio
27270 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63  n is always.** c
27280 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20  alled with four 
27290 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20  arguments - the 
272a0 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d  parent table nam
272b0 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  e, the parent co
272c0 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  lumn name,.** th
272d0 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61  e child table na
272e0 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64  me and the child
272f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a   column name..**
27300 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61  .**   fkey_colla
27310 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e  te_clause('paren
27320 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d  t-tab', 'parent-
27330 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62  col', 'child-tab
27340 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a  ', 'child-col').
27350 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
27360 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  of the named tab
27370 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64  les or columns d
27380 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  o not exist, thi
27390 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
273a0 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73  turns an empty s
273b0 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20  tring. An empty 
273c0 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72  string is also r
273d0 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20  eturned if both 
273e0 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f  tables.** and co
273f0 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20  lumns exist but 
27400 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65  have the same de
27410 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
27420 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a  sequence. Or,.**
27430 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62   if both exist b
27440 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ut the default c
27450 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
27460 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
27470 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
27480 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
27490 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20  tring " COLLATE 
274a0 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
274b0 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70  n>", where.** <p
274c0 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
274d0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
274e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
274f0 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ce of the parent
27500 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
27510 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65  ic void shellFke
27520 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a  yCollateClause(.
27530 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
27540 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
27550 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
27560 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
27570 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27580 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
27590 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
275a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
275b0 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  Parent;.  const 
275c0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c  char *zParentCol
275d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
275e0 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f  zParentSeq;.  co
275f0 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
27600 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
27610 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e  zChildCol;.  con
27620 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53  st char *zChildS
27630 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74  eq = 0;  /* Init
27640 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20  ialize to avoid 
27650 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
27660 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  arning */.  int 
27670 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
27680 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
27690 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
276a0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
276b0 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
276c0 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
276d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
276e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
276f0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
27700 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
27710 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
27720 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
27730 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
27740 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
27750 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
27760 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
27770 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
27780 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
27790 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
277a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
277b0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
277c0 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
277d0 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
277e0 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
277f0 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
27800 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
27810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27830 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
27840 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
27850 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
27860 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
27870 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
27880 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
27890 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
278a0 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
278b0 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
278c0 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
278d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
278e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
278f0 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
27900 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
27910 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
27920 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
27930 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
27940 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
27950 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
27960 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
27970 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
27980 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
27990 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
279a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
279b0 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
279c0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
279d0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
279e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
279f0 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
27a00 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
27a30 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
27a40 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
27a50 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27a80 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
27a90 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
27aa0 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
27ab0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
27ac0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
27ad0 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
27ae0 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
27af0 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
27b00 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
27b10 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
27b20 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
27b30 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
27b40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
27b50 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
27b60 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
27b70 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
27b80 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
27b90 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
27ba0 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
27bb0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
27be0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
27bf0 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
27c00 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
27c10 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
27c20 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
27c30 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
27c40 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27c70 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
27c80 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
27c90 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
27ca0 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
27cb0 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
27cc0 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
27cd0 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
27ce0 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
27cf0 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
27d00 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
27d10 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
27d20 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
27d30 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
27d40 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
27d50 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
27d60 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
27d70 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
27d80 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
27d90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
27da0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
27db0 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
27dc0 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45   child_table WHE
27dd0 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a  RE child_key=?".
27de0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69    **.  **    Thi
27df0 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69  s SELECT is simi
27e00 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74  lar to the one t
27e10 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
27e20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  keys implementat
27e30 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64  ion.  **    need
27e40 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61  s to run interna
27e50 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62  lly on child tab
27e60 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  les. If there is
27e70 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
27e80 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73  an.  **    be us
27e90 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
27ea0 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
27eb0 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75  it can also be u
27ec0 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20  sed by the FK.  
27ed0 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61  **    implementa
27ee0 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65  tion to optimize
27ef0 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
27f00 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
27f10 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
27f20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20     table..  **. 
27f30 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61   ** 1. A GLOB pa
27f40 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66  ttern suitable f
27f50 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  or sqlite3_strgl
27f60 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61  ob(). If the pla
27f70 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a  n output by.  **
27f80 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20      the EXPLAIN 
27f90 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
27fa0 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  nd matches this 
27fb0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68  pattern, then th
27fc0 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20  e schema.  **   
27fd0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64   contains an ind
27fe0 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ex that can be u
27ff0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
28000 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
28010 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65    ** 2. Human re
28020 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
28030 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
28040 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63  hild table and c
28050 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
28060 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68  *.  **       "ch
28070 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
28080 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32  key1, child_key2
28090 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20  )".  **.  ** 3. 
280a0 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
280b0 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
280c0 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  es the parent ta
280d0 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
280e0 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
280f0 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61        "parent_ta
28100 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c  ble(parent_key1,
28110 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20   parent_key2)". 
28120 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75   **.  ** 4. A fu
28130 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ll CREATE INDEX 
28140 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e  statement for an
28150 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c   index that coul
28160 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  d be used to.  *
28170 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45  *    optimize DE
28180 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
28190 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
281a0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65   parent table. e
281b0 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
281c0 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
281d0 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68  X child_table_ch
281e0 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64  ild_key ON child
281f0 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
28200 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20  )".  **.  ** 5. 
28210 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
28220 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  parent table..  
28230 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69  **.  ** These si
28240 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65  x values are use
28250 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63  d by the C logic
28260 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61   below to genera
28270 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20  te the report.. 
28280 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28290 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45   *zSql =.  "SELE
282a0 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  CT ".    "     '
282b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
282c0 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
282d0 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
282e0 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
282f0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
28300 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
28310 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
28320 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
28330 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
28340 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
28350 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
28360 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
28370 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
28380 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
28390 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
283a0 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
283b0 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
283c0 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
283d0 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
283e0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
283f0 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
28400 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
28410 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
28420 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
28430 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
28440 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
28450 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
28460 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
28470 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
28480 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
28490 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
284a0 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
284b0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
284c0 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
284d0 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
284e0 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
284f0 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
28500 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
28510 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
28520 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
28530 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
28540 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
28550 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
28560 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
28570 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
28580 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
28590 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
285a0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
285b0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
285c0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
285d0 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
285e0 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
285f0 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
28600 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
28610 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
28620 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
28630 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
28640 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
28650 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
28660 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
28670 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
28680 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
28690 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
286a0 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
286b0 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
286c0 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
286d0 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
286e0 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
286f0 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
28700 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
28710 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
28720 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
28730 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
28740 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
28750 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
28760 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
28770 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
28780 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
28790 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
287a0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65  e3_strnicmp("-ve
287b0 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d  rbose", azArg[i]
287c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
287d0 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20   bVerbose = 1;. 
287e0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
287f0 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ( n>1 && sqlite3
28800 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75  _strnicmp("-grou
28810 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72  pbyparent", azAr
28820 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
28830 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61 72       bGroupByPar
28840 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  ent = 1;.      z
28850 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b  Indent = "    ";
28860 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
28870 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
28880 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
28890 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73  : %s %s ?-verbos
288a0 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65  e? ?-groupbypare
288b0 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  nt?\n",.        
288c0 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72    azArg[0], azAr
288d0 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  g[1].      );.  
288e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
288f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
28900 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
28910 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61  r the fkey_colla
28920 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20  te_clause() SQL 
28930 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63  function */.  rc
28940 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
28950 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
28960 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
28970 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  use", 4, SQLITE_
28980 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73  UTF8,.      0, s
28990 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43  hellFkeyCollateC
289a0 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b  lause, 0, 0.  );
289b0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
289c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
289d0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
289e0 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
289f0 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20  -1, &pSql, 0);. 
28a00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
28a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
28a20 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
28a30 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79  Sql, 1, bGroupBy
28a40 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  Parent);.  }..  
28a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28a60 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
28a70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  ;.    char *zPre
28a80 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  v = 0;.    while
28a90 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
28aa0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
28ab0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
28ac0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  s = -1;.      sq
28ad0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
28ae0 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lain = 0;.      
28af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50  const char *zEQP
28b00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
28b10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28b20 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
28b30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28b40 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63  zGlob = (const c
28b50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
28b60 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31  umn_text(pSql, 1
28b70 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
28b80 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f  har *zFrom = (co
28b90 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
28ba0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
28bb0 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 2);.      co
28bc0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
28bd0 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
28be0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
28bf0 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  text(pSql, 3);. 
28c00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
28c10 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zCI = (const ch
28c20 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
28c30 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29  mn_text(pSql, 4)
28c40 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
28c50 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63  ar *zParent = (c
28c60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
28c70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28c80 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20  Sql, 5);..      
28c90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
28ca0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
28cb0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
28cc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
28cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
28ce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
28cf0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
28d00 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
28d10 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
28d20 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20  nst char *zPlan 
28d30 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
28d40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
28d50 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
28d60 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
28d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  .              0
28d80 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
28d90 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a  b(zGlob, zPlan).
28da0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d             || 0=
28db0 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62  =sqlite3_strglob
28dc0 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e  (zGlobIPK, zPlan
28dd0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28de0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
28df0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
28e00 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  (pExplain);.    
28e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28e20 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  _OK ) break;..  
28e30 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
28e40 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
28e50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
28e60 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72  or: internal err
28e70 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or");.        br
28e80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
28e90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 47  {.        if( bG
28ea0 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20  roupByParent.   
28eb0 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f 73       && (bVerbos
28ec0 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20  e || res==0).   
28ed0 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d       && (zPrev==
28ee0 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
28ef0 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50  icmp(zParent, zP
28f00 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b  rev)).        ){
28f10 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
28f20 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50  rintf(out, "-- P
28f30 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e  arent table %s\n
28f40 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ", zParent);.   
28f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28f60 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20  ree(zPrev);.    
28f70 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71        zPrev = sq
28f80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
28f90 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  s", zParent);.  
28fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28fb0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
28fc0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
28fd0 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d  ntf(out, "%s%s -
28fe0 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e  -> %s\n", zInden
28ff0 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29  t, zCI, zTarget)
29000 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
29010 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
29020 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
29030 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20  intf(out, "%s/* 
29040 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65 73  no extra indexes
29050 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25 73   required for %s
29060 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   -> %s */\n",.  
29070 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64              zInd
29080 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72  ent, zFrom, zTar
29090 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  get.          );
290a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
290b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
290c0 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29  ite3_free(zPrev)
290d0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
290e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
290f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29100 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
29110 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
29120 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32  ;.    }..    rc2
29130 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
29140 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69  ize(pSql);.    i
29150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29160 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f   && rc2!=SQLITE_
29170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29180 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f   rc2;.      raw_
29190 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
291a0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
291b0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
291c0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
291d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
291e0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
291f0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
29200 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
29210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
29220 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69  entation of ".li
29230 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  nt" dot command.
29240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
29250 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20  intDotCommand(. 
29260 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
29270 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
29280 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
29290 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
292a0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
292d0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
292e0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
292f0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29320 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
29330 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  [] */.){.  int n
29340 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32  ;.  n = (nArg>=2
29350 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   ? strlen30(azAr
29360 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66  g[1]) : 0);.  if
29370 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33  ( n<1 || sqlite3
29380 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b  _strnicmp(azArg[
29390 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65  1], "fkey-indexe
293a0 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73  s", n) ) goto us
293b0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69  age;.  return li
293c0 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53  ntFkeyIndexes(pS
293d0 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72  tate, azArg, nAr
293e0 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72  g);.. usage:.  r
293f0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29400 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d  , "Usage %s sub-
29410 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65  command ?switche
29420 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b  s...?\n", azArg[
29430 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  0]);.  raw_print
29440 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65  f(stderr, "Where
29450 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72   sub-commands ar
29460 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72  e:\n");.  raw_pr
29470 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20  intf(stderr, "  
29480 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e    fkey-indexes\n
29490 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
294a0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69  ITE_ERROR;.}..#i
294b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
294c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
294d0 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
294e0 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
294f0 29 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29540 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72  ****.** The ".ar
29550 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20  chive" or ".ar" 
29560 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
29570 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
29580 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
29590 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
295a0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
295b0 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zSql, .  sqlite
295c0 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
295d0 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  ){.  *ppStmt = 0
295e0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
295f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29600 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29610 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
29620 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
29630 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
29640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29650 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29660 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f  tderr, "sql erro
29670 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a  r: %s (%d)\n", .
29680 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29690 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71  3_errmsg(db), sq
296a0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
296b0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
296c0 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
296d0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
296e0 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
296f0 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
29700 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
29710 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
29720 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
29730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
29740 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
29750 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
29760 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
29770 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
29780 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
29790 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
297a0 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
297b0 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
297c0 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
297d0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
297e0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
297f0 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
29800 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
29810 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
29820 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
29830 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
29840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29860 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
29870 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74  lFinalize(.  int
29880 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
29890 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
298a0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
298b0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
298c0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
298d0 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
298e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
298f0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
29900 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d  ;.    if( *pRc==
29910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29940 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29950 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
29960 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
29970 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
29980 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20   }.      *pRc = 
29990 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
299a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
299b0 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a  llReset(.  int *
299c0 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
299d0 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
299e0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
299f0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
29a00 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
29a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
29a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29a30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
29a40 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
29a50 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
29a60 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29a70 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
29a80 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
29a90 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
29aa0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
29ab0 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a  = rc;.  }.}./*.*
29ac0 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72  * Structure repr
29ad0 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c  esenting a singl
29ae0 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  e ".ar" command.
29af0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
29b00 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43  ct ArCommand ArC
29b10 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41  ommand;.struct A
29b20 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20  rCommand {.  u8 
29b30 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20  eCmd;           
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b50 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75  An AR_CMD_* valu
29b60 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f  e */.  u8 bVerbo
29b70 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
29b80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29b90 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20  f --verbose */. 
29ba0 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20   u8 bZip;       
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
29bd0 61 72 63 68 69 76 65 20 69 73 20 61 20 5a 49 50  archive is a ZIP
29be0 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e   */.  u8 bDryRun
29bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
29c10 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20   --dry-run */.  
29c20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20  u8 bAppend;     
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70  /* True if --app
29c50 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d  end */.  u8 from
29c60 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  CmdLine;        
29c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20           /* Run 
29c80 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20  from -A instead 
29c90 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20  of .archive */. 
29ca0 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
29cd0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29ce0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54  */.  char *zSrcT
29cf0 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
29d00 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c       /* "sqlar",
29d10 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29   "zipfile($file)
29d20 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20  " or "zip" */.  
29d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
29d40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29d50 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65  /* --file argume
29d60 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  nt, or NULL */. 
29d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
29d80 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
29d90 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20   /* --directory 
29da0 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c  argument, or NUL
29db0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  L */.  char **az
29dc0 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
29dd0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
29de0 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
29df0 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  ents */.  ShellS
29e00 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tate *p;        
29e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65            /* She
29e20 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71  ll state */.  sq
29e30 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e50 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
29e60 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69 76 65  ning the archive
29e70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
29e80 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73  int a usage mess
29e90 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
29ea0 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
29eb0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  r and return SQL
29ec0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
29ed0 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65  atic int arUsage
29ee0 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f  (FILE *f){.  sho
29ef0 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65  wHelp(f,"archive
29f00 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
29f10 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
29f20 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
29f30 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  or message for t
29f40 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74  he .ar command t
29f50 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
29f60 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
29f70 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
29f80 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41  int arErrorMsg(A
29f90 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
29fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
29fb0 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
29fc0 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
29fd0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
29fe0 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  Fmt);.  z = sqli
29ff0 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
2a000 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2a010 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (ap);.  utf8_pri
2a020 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2a030 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  or: %s\n", z);. 
2a040 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d   if( pAr->fromCm
2a050 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66  dLine ){.    utf
2a060 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a070 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72   "Use \"-A\" for
2a080 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a   more help\n");.
2a090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66    }else{.    utf
2a0a0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a0b0 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65   "Use \".archive
2a0c0 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f   --help\" for mo
2a0d0 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d  re help\n");.  }
2a0e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2a0f0 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  z);.  return SQL
2a100 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
2a110 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41  .** Values for A
2a120 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a  rCommand.eCmd..*
2a130 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  /.#define AR_CMD
2a140 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31 0a  _CREATE       1.
2a150 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55  #define AR_CMD_U
2a160 50 44 41 54 45 20 20 20 20 20 20 20 32 0a 23 64  PDATE       2.#d
2a170 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e 53  efine AR_CMD_INS
2a180 45 52 54 20 20 20 20 20 20 20 33 0a 23 64 65 66  ERT       3.#def
2a190 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ine AR_CMD_EXTRA
2a1a0 43 54 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  CT      4.#defin
2a1b0 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20  e AR_CMD_LIST   
2a1c0 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20        5.#define 
2a1d0 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20  AR_CMD_HELP     
2a1e0 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68      6../*.** Oth
2a1f0 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29  er (non-command)
2a200 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64   switches..*/.#d
2a210 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a220 56 45 52 42 4f 53 45 20 20 20 20 20 37 0a 23 64  VERBOSE     7.#d
2a230 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a240 46 49 4c 45 20 20 20 20 20 20 20 20 38 0a 23 64  FILE        8.#d
2a250 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a260 44 49 52 45 43 54 4f 52 59 20 20 20 39 0a 23 64  DIRECTORY   9.#d
2a270 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a280 41 50 50 45 4e 44 20 20 20 20 20 31 30 0a 23 64  APPEND     10.#d
2a290 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a2a0 44 52 59 52 55 4e 20 20 20 20 20 31 31 0a 0a 73  DRYRUN     11..s
2a2b0 74 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63  tatic int arProc
2a2c0 65 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d  essSwitch(ArComm
2a2d0 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53  and *pAr, int eS
2a2e0 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61  witch, const cha
2a2f0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74  r *zArg){.  swit
2a300 63 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20  ch( eSwitch ){. 
2a310 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43     case AR_CMD_C
2a320 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  REATE:.    case 
2a330 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
2a340 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2a350 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41  LIST:.    case A
2a360 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20  R_CMD_UPDATE:.  
2a370 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e    case AR_CMD_IN
2a380 53 45 52 54 3a 0a 20 20 20 20 63 61 73 65 20 41  SERT:.    case A
2a390 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
2a3a0 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64 20    if( pAr->eCmd 
2a3b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2a3c0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2a3d0 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d  , "multiple comm
2a3e0 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20  and options");. 
2a3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
2a400 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68  ->eCmd = eSwitch
2a410 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
2a420 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
2a430 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20  CH_DRYRUN:.     
2a440 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20   pAr->bDryRun = 
2a450 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2a460 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
2a470 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20  CH_VERBOSE:.    
2a480 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20    pAr->bVerbose 
2a490 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2a4a0 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
2a4b0 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20  ITCH_APPEND:.   
2a4c0 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20     pAr->bAppend 
2a4d0 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 1;.      /* Fa
2a4e0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66  ll thru into --f
2a4f0 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ile */.    case 
2a500 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a  AR_SWITCH_FILE:.
2a510 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65        pAr->zFile
2a520 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62   = zArg;.      b
2a530 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
2a540 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
2a550 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a  RY:.      pAr->z
2a560 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  Dir = zArg;.    
2a570 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
2a580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
2a5a0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
2a5b0 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63  e for an ".ar" c
2a5c0 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75  ommand. The resu
2a5d0 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  lts are written 
2a5e0 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  into.** structur
2a5f0 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45  e (*pAr). SQLITE
2a600 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2a610 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  if the command l
2a620 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a  ine is parsed.**
2a630 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
2a640 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
2a650 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
2a660 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61  tten to stderr a
2a670 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  nd .** SQLITE_ER
2a680 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ROR returned..*/
2a690 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61  .static int arPa
2a6a0 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68  rseCommand(.  ch
2a6b0 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6d0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
2a6e0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
2a6f0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
2a700 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a720 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2a730 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
2a740 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  /.  ArCommand *p
2a750 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar              
2a760 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
2a770 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
2a780 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  {.  struct ArSwi
2a790 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  tch {.    const 
2a7a0 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20  char *zLong;.   
2a7b0 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20   char cShort;.  
2a7c0 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20    u8 eSwitch;.  
2a7d0 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61    u8 bArg;.  } a
2a7e0 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20  Switch[] = {.   
2a7f0 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20   { "create",    
2a800 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41  'c', AR_CMD_CREA
2a810 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  TE,       0 },. 
2a820 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20     { "extract", 
2a830 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58    'x', AR_CMD_EX
2a840 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c  TRACT,      0 },
2a850 0a 20 20 20 20 7b 20 22 69 6e 73 65 72 74 22 2c  .    { "insert",
2a860 20 20 20 20 27 69 27 2c 20 41 52 5f 43 4d 44 5f      'i', AR_CMD_
2a870 49 4e 53 45 52 54 2c 20 20 20 20 20 20 20 30 20  INSERT,       0 
2a880 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c  },.    { "list",
2a890 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d        't', AR_CM
2a8a0 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  D_LIST,         
2a8b0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61  0 },.    { "upda
2a8c0 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f  te",    'u', AR_
2a8d0 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20  CMD_UPDATE,     
2a8e0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65    0 },.    { "he
2a8f0 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41  lp",      'h', A
2a900 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20  R_CMD_HELP,     
2a910 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2a920 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c  verbose",   'v',
2a930 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
2a940 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b  SE,   0 },.    {
2a950 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66   "file",      'f
2a960 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  ', AR_SWITCH_FIL
2a970 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20  E,      1 },.   
2a980 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20   { "append",    
2a990 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41  'a', AR_SWITCH_A
2a9a0 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20  PPEND,    1 },. 
2a9b0 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22     { "directory"
2a9c0 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48  , 'C', AR_SWITCH
2a9d0 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c  _DIRECTORY, 1 },
2a9e0 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c  .    { "dryrun",
2a9f0 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54      'n', AR_SWIT
2aa00 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20  CH_DRYRUN,    0 
2aa10 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53  },.  };.  int nS
2aa20 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61  witch = sizeof(a
2aa30 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66  Switch) / sizeof
2aa40 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68  (struct ArSwitch
2aa50 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  );.  struct ArSw
2aa60 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53  itch *pEnd = &aS
2aa70 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a  witch[nSwitch];.
2aa80 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29  .  if( nArg<=1 )
2aa90 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
2aaa0 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67  f(stderr, "Wrong
2aab0 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
2aac0 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22  ents.  Usage:\n"
2aad0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72  );.    return ar
2aae0 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20  Usage(stderr);. 
2aaf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
2ab00 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a   *z = azArg[1];.
2ab10 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
2ab20 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
2ab30 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20  aditional style 
2ab40 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e  [tar] invocation
2ab50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
2ab60 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20  .      int iArg 
2ab70 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 2;.      for(i
2ab80 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
2ab90 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2aba0 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20  ar *zArg = 0;.  
2abb0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2abc0 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
2abd0 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
2abe0 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
2abf0 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
2ac00 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
2ac10 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
2ac20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2ac30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2ac40 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
2ac50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2ac60 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
2ac70 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
2ac80 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a  on: %c", z[i]);.
2ac90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aca0 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
2acb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2acc0 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a  ( iArg>=nArg ){.
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2ace0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2acf0 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
2ad00 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
2ad10 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20   %c",z[i]);.    
2ad20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ad30 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69    zArg = azArg[i
2ad40 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  Arg++];.        
2ad50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72  }.        if( ar
2ad60 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
2ad70 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
2ad80 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
2ad90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ada0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
2adb0 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
2adc0 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  rg;.      if( pA
2add0 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  r->nArg>0 ){.   
2ade0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
2adf0 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
2ae00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ae10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  e{.      /* Non-
2ae20 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f  traditional invo
2ae30 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
2ae40 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20  int iArg;.      
2ae50 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67  for(iArg=1; iArg
2ae60 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a  <nArg; iArg++){.
2ae70 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
2ae80 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67         z = azArg
2ae90 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
2aea0 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
2aeb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
2aec0 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
2aed0 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61  and line words a
2aee0 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
2aef0 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ents. */.       
2af00 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
2af10 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
2af20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
2af30 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
2af40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2af50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af60 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
2af70 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
2af80 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]!='-' ){.   
2af90 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
2afa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2afb0 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74  r more short opt
2afc0 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ions */.        
2afd0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
2afe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2aff0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2b000 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
2b010 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
2b020 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
2b030 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2b040 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2b050 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2b060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b070 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
2b080 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
2b090 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b0a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
2b0b0 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
2b0c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b0d0 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2b0e0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
2b0f0 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29  tion: %c", z[i])
2b100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2b110 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b120 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
2b130 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b140 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  i<(n-1) ){.     
2b150 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
2b160 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  = &z[i+1];.     
2b170 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
2b180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b1a0 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
2b1b0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2b1d0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2b1e0 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  (pAr, "option re
2b1f0 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
2b200 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20  nt: %c",z[i]);. 
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2b220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b230 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b   zArg = azArg[++
2b240 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
2b250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b270 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
2b280 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e  itch(pAr, pOpt->
2b290 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
2b2a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b2b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
2b2c0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2b2d0 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29  if( z[2]=='\0' )
2b2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
2b2f0 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69   -- option, indi
2b300 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  cating that all 
2b310 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e  remaining comman
2b320 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20  d line words.   
2b330 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f         ** are co
2b340 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e  mmand arguments.
2b350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2b360 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
2b370 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20  rg[iArg+1];.    
2b380 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
2b390 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20  = nArg-iArg-1;. 
2b3a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b3b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f           /* A lo
2b3d0 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
2b3e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b3f0 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20  r *zArg = 0;    
2b400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
2b410 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c  ment for option,
2b420 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20   if any */.     
2b430 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
2b440 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30  itch *pMatch = 0
2b450 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  ;      /* Matchi
2b460 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
2b470 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
2b480 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20  Switch *pOpt;   
2b490 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2b4a0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
2b4b0 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
2b4c0 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
2b4d0 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
2b4e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2b4f0 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74  ar *zLong = pOpt
2b500 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20  ->zLong;.       
2b510 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d       if( (n-2)<=
2b520 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20  strlen30(zLong) 
2b530 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b  && 0==memcmp(&z[
2b540 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20  2], zLong, n-2) 
2b550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b560 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20   if( pMatch ){. 
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2b580 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2b590 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  (pAr, "ambiguous
2b5a0 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
2b5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b5d0 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
2b5e0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
2b5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b600 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
2b610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2b620 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
2b630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2b640 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
2b650 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
2b660 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  on: %s", z);.   
2b670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b680 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62     if( pMatch->b
2b690 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
2b6a0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
2b6b0 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
2b6c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2b6d0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f  ErrorMsg(pAr, "o
2b6e0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
2b6f0 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c  n argument: %s",
2b700 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   z);.           
2b710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a   }.            z
2b720 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41  Arg = azArg[++iA
2b730 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg];.          }
2b740 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
2b750 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
2b760 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69  Ar, pMatch->eSwi
2b770 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
2b780 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2b790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b7a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2b7b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b7c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2b7d0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2b7e0 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d  s that all argum
2b7f0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
2b800 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b  ArCommand.azArg[
2b810 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72  ].** array refer
2b820 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62   to archive memb
2b830 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20  ers, as for the 
2b840 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c  --extract or --l
2b850 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a  ist commands. .*
2b860 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74  * It checks that
2b870 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72   each of them ar
2b880 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e  e present. If an
2b890 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  y specified file
2b8a0 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65   is not.** prese
2b8b0 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76  nt in the archiv
2b8c0 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70  e, an error is p
2b8d0 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72  rinted to stderr
2b8e0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a   and an error.**
2b8f0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2b900 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
2b910 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75  l specified argu
2b920 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e  ments are presen
2b930 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68  t in.** the arch
2b940 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ive, SQLITE_OK i
2b950 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2b960 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2b970 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c  strips any trail
2b980 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65  ing '/' characte
2b990 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67  rs from each arg
2b9a0 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69  ument..** This i
2b9b0 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  s consistent wit
2b9c0 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74  h the way the [t
2b9d0 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d  ar] command seem
2b9e0 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20  s to work on.** 
2b9f0 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  Linux..*/.static
2ba00 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72   int arCheckEntr
2ba10 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  ies(ArCommand *p
2ba20 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ar){.  int rc = 
2ba30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2ba40 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20   pAr->nArg ){.  
2ba50 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
2ba60 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
2ba70 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68  est = 0;..    sh
2ba80 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2ba90 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
2baa0 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22  pTest,.        "
2bab0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
2bac0 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24   %s WHERE name=$
2bad0 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20  name", .        
2bae0 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20  pAr->zSrcTable. 
2baf0 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71     );.    j = sq
2bb00 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2bb10 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74  eter_index(pTest
2bb20 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20  , "$name");.    
2bb30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
2bb40 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
2bb50 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
2bb60 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
2bb70 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
2bb80 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
2bb90 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74  30(z);.      int
2bba0 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20   bOk = 0;.      
2bbb0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
2bbc0 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b  n-1]=='/' ) n--;
2bbd0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c  .      z[n] = '\
2bbe0 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0';.      sqlite
2bbf0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73  3_bind_text(pTes
2bc00 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  t, j, z, -1, SQL
2bc10 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
2bc20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
2bc30 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2bc40 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pTest) ){.      
2bc50 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20    bOk = 1;.     
2bc60 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
2bc70 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b  set(&rc, pTest);
2bc80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2bc90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
2bca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2bcb0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2bcc0 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  , "not found in 
2bcd0 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20  archive: %s\n", 
2bce0 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
2bcf0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2bd00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2bd10 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
2bd20 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a  rc, pTest);.  }.
2bd30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bd40 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57  /*.** Format a W
2bd50 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2bd60 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61   can be used aga
2bd70 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22  inst the "sqlar"
2bd80 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65   table to.** ide
2bd90 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76  ntify all archiv
2bda0 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d  e members that m
2bdb0 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64  atch the command
2bdc0 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a   arguments held.
2bdd0 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65  ** in (*pAr). Le
2bde0 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63  ave this WHERE c
2bdf0 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65  lause in (*pzWhe
2be00 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  re) before retur
2be10 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  ning..** The cal
2be20 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
2be30 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c  le for eventuall
2be40 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
2be50 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61  3_free() on.** a
2be60 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a  ny non-NULL (*pz
2be70 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f  Where) value..*/
2be80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57  .static void arW
2be90 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e  hereClause(.  in
2bea0 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d  t *pRc, .  ArCom
2beb0 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68  mand *pAr, .  ch
2bec0 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20  ar **pzWhere    
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bee0 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20   OUT: New WHERE 
2bef0 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  clause */.){.  c
2bf00 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
2bf10 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
2bf20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2bf30 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29  ( pAr->nArg==0 )
2bf40 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d  {.      zWhere =
2bf50 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2bf60 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ("1");.    }else
2bf70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
2bf80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2bf90 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
2bfa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
2bfb0 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nArg; i++){.  
2bfc0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2bfd0 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67   *z = pAr->azArg
2bfe0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68  [i];.        zWh
2bff0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
2c000 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2c010 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
2c020 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d  q' OR substr(nam
2c030 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22  e,1,%d) = '%q/'"
2c040 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  , .          zWh
2c050 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74  ere, zSep, z, st
2c060 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20  rlen30(z)+1, z. 
2c070 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2c080 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20    if( zWhere==0 
2c090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  ){.          *pR
2c0a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c0c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2c0d0 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52       zSep = " OR
2c0e0 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
2c0f0 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65  }.  }.  *pzWhere
2c100 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a   = zWhere;.}../*
2c110 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2c120 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22  on of .ar "lisT"
2c130 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
2c140 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43  atic int arListC
2c150 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
2c160 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
2c170 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45  char *zSql = "SE
2c180 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20  LECT %s FROM %s 
2c190 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f  WHERE %s"; .  co
2c1a0 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73  nst char *azCols
2c1b0 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65  [] = {.    "name
2c1c0 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d  ",.    "lsmode(m
2c1d0 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69  ode), sz, dateti
2c1e0 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65  me(mtime, 'unixe
2c1f0 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20  poch'), name".  
2c200 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  };..  char *zWhe
2c210 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  re = 0;.  sqlite
2c220 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
2c230 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
2c240 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
2c250 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65  es(pAr);.  arWhe
2c260 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41  reClause(&rc, pA
2c270 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20  r, &zWhere);..  
2c280 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
2c290 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
2c2a0 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a   &pSql, zSql, az
2c2b0 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f  Cols[pAr->bVerbo
2c2c0 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se],.           
2c2d0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a            pAr->z
2c2e0 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
2c2f0 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  );.  if( pAr->bD
2c300 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
2c310 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2c320 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
2c330 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29  lite3_sql(pSql))
2c340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2c350 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2c360 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
2c370 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2c380 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  pSql) ){.      i
2c390 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  f( pAr->bVerbose
2c3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2c3b0 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2c3c0 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20  out, "%s % 10d  
2c3d0 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s  %s\n",.     
2c3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2c3f0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2c400 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
2c410 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c420 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20  int(pSql, 1), . 
2c430 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c440 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2c450 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20  Sql, 2),.       
2c460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2c470 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
2c480 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2c490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2c4b0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2c4c0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
2c4d0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
2c4e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c4f0 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c    }.  shellFinal
2c500 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
2c510 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c520 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
2c530 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
2c540 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2c550 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63   .ar "eXtract" c
2c560 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74  ommand. .*/.stat
2c570 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74  ic int arExtract
2c580 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
2c590 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
2c5a0 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a   char *zSql1 = .
2c5b0 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20      "SELECT ".  
2c5c0 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d    " ($dir || nam
2c5d0 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65  e),".    " write
2c5e0 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61  file(($dir || na
2c5f0 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d  me), %s, mode, m
2c600 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f  time) ".    "FRO
2c610 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20  M %s WHERE (%s) 
2c620 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c  AND (data IS NUL
2c630 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20  L OR $dirOnly = 
2c640 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61  0)".    " AND na
2c650 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e  me NOT GLOB '*..
2c660 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e  [/\\]*'";..  con
2c670 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61  st char *azExtra
2c680 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22  Arg[] = { .    "
2c690 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73  sqlar_uncompress
2c6a0 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20  (data, sz)",.   
2c6b0 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20   "data".  };..  
2c6c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2c6d0 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
2c6e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c6f0 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
2c700 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
2c710 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
2c720 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
2c730 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
2c740 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
2c750 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
2c760 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
2c770 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
2c780 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
2c790 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
2c7a0 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
2c7b0 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
2c7c0 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
2c7d0 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
2c7e0 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
2c7f0 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
2c800 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2c810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c820 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
2c830 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
2c840 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
2c850 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
2c860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
2c870 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
2c880 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
2c890 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2c8a0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
2c8b0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
2c8c0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
2c8d0 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
2c8e0 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20  Sql, zSql1, .   
2c8f0 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41     azExtraArg[pA
2c900 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a  r->bZip], pAr->z
2c910 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
2c920 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
2c930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c940 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
2c950 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2c960 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29  ex(pSql, "$dir")
2c970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
2c980 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c  nd_text(pSql, j,
2c990 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54   zDir, -1, SQLIT
2c9a0 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20  E_STATIC);..    
2c9b0 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
2c9c0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
2c9d0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
2c9e0 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
2c9f0 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
2ca00 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
2ca10 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
2ca20 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
2ca30 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
2ca40 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
2ca50 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
2ca60 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
2ca70 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
2ca80 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
2ca90 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
2caa0 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
2cab0 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
2cac0 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
2cad0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
2cae0 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
2caf0 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
2cb00 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2cb10 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
2cb20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
2cb30 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
2cb40 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79  (pSql, "$dirOnly
2cb50 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
2cb60 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
2cb70 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   j, i);.      if
2cb80 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
2cb90 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2cba0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2cbb0 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
2cbc0 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
2cbd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cbe0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2cbf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
2cc00 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2cc10 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
2cc20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
2cc30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73   && pAr->bVerbos
2cc40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2cc50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2cc60 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2cc70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2cc80 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
2cc90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ccb0 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
2ccc0 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20  &rc, pSql);.    
2ccd0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2cce0 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
2ccf0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
2cd00 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c  ree(zDir);.  sql
2cd10 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
2cd20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2cd30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
2cd40 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
2cd50 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64  n zSql.  Or if d
2cd60 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c  oing a --dryrun,
2cd70 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74   merely print it
2cd80 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   out..*/.static 
2cd90 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72  int arExecSql(Ar
2cda0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
2cdb0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
2cdc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
2cdd0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
2cde0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2cdf0 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2ce00 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
2ce10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ce20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2ce30 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2ce40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2ce50 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71  xec(pAr->db, zSq
2ce60 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
2ce70 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
2ce80 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2ce90 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f  tf(stdout, "ERRO
2cea0 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  R: %s\n", zErr);
2ceb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2cec0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
2ced0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cee0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
2cef0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
2cf00 72 20 22 63 72 65 61 74 65 22 2c 20 22 69 6e 73  r "create", "ins
2cf10 65 72 74 22 2c 20 61 6e 64 20 22 75 70 64 61 74  ert", and "updat
2cf20 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a  e" commands..**.
2cf30 2a 2a 20 20 20 20 20 63 72 65 61 74 65 20 20 20  **     create   
2cf40 20 2d 3e 20 20 20 20 20 43 72 65 61 74 65 20 61   ->     Create a
2cf50 20 6e 65 77 20 53 51 4c 20 61 72 63 68 69 76 65   new SQL archive
2cf60 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72 74 20 20  .**     insert  
2cf70 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20    ->     Insert 
2cf80 6f 72 20 72 65 69 6e 73 65 72 74 20 61 6c 6c 20  or reinsert all 
2cf90 66 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a 20  files listed.** 
2cfa0 20 20 20 20 75 70 64 61 74 65 20 20 20 20 2d 3e      update    ->
2cfb0 20 20 20 20 20 49 6e 73 65 72 74 20 66 69 6c 65       Insert file
2cfc0 73 20 74 68 61 74 20 68 61 76 65 20 63 68 61 6e  s that have chan
2cfd0 67 65 64 20 6f 72 20 74 68 61 74 20 77 65 72 65  ged or that were
2cfe0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   not.**         
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
2d000 76 69 6f 75 73 6c 79 20 69 6e 20 74 68 65 20 61  viously in the a
2d010 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43 72 65  rchive.**.** Cre
2d020 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20  ate the "sqlar" 
2d030 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
2d040 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73  abase if it does
2d050 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
2d060 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20  st..** Then add 
2d070 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65  each file in the
2d080 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20   azFile[] array 
2d090 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20  to the archive. 
2d0a0 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61  Directories.** a
2d0b0 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69  re added recursi
2d0c0 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e  vely. If argumen
2d0d0 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f  t bVerbose is no
2d0e0 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67  n-zero, a messag
2d0f0 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20  e is.** printed 
2d100 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61  on stdout for ea
2d110 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64  ch file archived
2d120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61  ..**.** The crea
2d130 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68  te command is th
2d140 65 20 73 61 6d 65 20 61 73 20 75 70 64 61 74 65  e same as update
2d150 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
2d160 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78   drops.** any ex
2d170 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74  isting "sqlar" t
2d180 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69  able before begi
2d190 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22 69 6e 73  nning.  The "ins
2d1a0 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  ert" command.** 
2d1b0 61 6c 77 61 79 73 20 6f 76 65 72 77 72 69 74 65  always overwrite
2d1c0 73 20 65 76 65 72 79 20 66 69 6c 65 20 6e 61 6d  s every file nam
2d1d0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
2d1e0 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20 61 73  d-line, where as
2d1f0 0a 2a 2a 20 22 75 70 64 61 74 65 22 20 6f 6e 6c  .** "update" onl
2d200 79 20 6f 76 65 72 77 72 69 74 65 73 20 69 66 20  y overwrites if 
2d210 74 68 65 20 73 69 7a 65 20 6f 72 20 6d 74 69 6d  the size or mtim
2d220 65 20 6f 72 20 6d 6f 64 65 20 68 61 73 20 63 68  e or mode has ch
2d230 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
2d240 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72 55   int arCreateOrU
2d250 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  pdateCommand(.  
2d260 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2d290 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73  ents and options
2d2a0 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74   */.  int bUpdat
2d2b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2d2c0 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66 6f        /* true fo
2d2d0 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 2a 2f  r a --create. */
2d2e0 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66 43 68  .  int bOnlyIfCh
2d2f0 61 6e 67 65 64 20 20 20 20 20 20 20 20 20 20 20  anged           
2d300 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74     /* Only updat
2d310 65 20 69 66 20 66 69 6c 65 20 68 61 73 20 63 68  e if file has ch
2d320 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f  anged */.){.  co
2d330 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
2d340 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41  e = .      "CREA
2d350 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
2d360 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22  EXISTS sqlar(\n"
2d370 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54  .      "  name T
2d380 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
2d390 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65    -- name of the
2d3a0 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22   file\n".      "
2d3b0 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20    mode INT,     
2d3c0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63            -- acc
2d3d0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c  ess permissions\
2d3e0 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d  n".      "  mtim
2d3f0 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  e INT,          
2d400 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69      -- last modi
2d410 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22  fication time\n"
2d420 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54  .      "  sz INT
2d430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d440 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69    -- original fi
2d450 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20  le size\n".     
2d460 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20   "  data BLOB   
2d470 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63              -- c
2d480 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e  ompressed conten
2d490 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a  t\n".      ")";.
2d4a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2d4b0 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c  rop = "DROP TABL
2d4c0 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61  E IF EXISTS sqla
2d4d0 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r";.  const char
2d4e0 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20   *zInsertFmt[2] 
2d4f0 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43  = {.     "REPLAC
2d500 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
2d510 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74  ode,mtime,sz,dat
2d520 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
2d530 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
2d540 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
2d550 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
2d560 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
2d570 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73       "    CASE s
2d580 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64  ubstr(lsmode(mod
2d590 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20  e),1,1)\n".     
2d5a0 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20  "      WHEN '-' 
2d5b0 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61  THEN length(data
2d5c0 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
2d5d0 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30   WHEN 'd' THEN 0
2d5e0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
2d5f0 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a  ELSE -1 END,\n".
2d600 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f       "    sqlar_
2d610 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e  compress(data)\n
2d620 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66  ".     "  FROM f
2d630 73 64 69 72 28 25 51 2c 25 51 29 20 41 53 20 64  sdir(%Q,%Q) AS d
2d640 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20 57  isk\n".     "  W
2d650 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65  HERE lsmode(mode
2d660 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27  ) NOT LIKE '?%%'
2d670 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20 20 20  %s;".     ,.    
2d680 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
2d690 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
2d6a0 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  e,data)\n".     
2d6b0 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
2d6c0 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
2d6d0 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
2d6e0 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
2d6f0 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64  ,\n".     "    d
2d700 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ata\n".     "  F
2d710 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
2d720 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20   AS disk\n".    
2d730 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2d740 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2d750 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b 0a 20  '?%%'%s;".  };. 
2d760 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d780 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
2d790 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65  g through azFile
2d7a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d7d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  n code */.  cons
2d7e0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30  t char *zTab = 0
2d7f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
2d800 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  QL table into wh
2d810 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  ich to insert */
2d820 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2d830 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b   char zTemp[50];
2d840 0a 20 20 63 68 61 72 20 2a 7a 45 78 69 73 74 73  .  char *zExists
2d850 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65 63 53   = 0;..  arExecS
2d860 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20  ql(pAr, "PRAGMA 
2d870 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b  page_size=512");
2d880 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71  .  rc = arExecSq
2d890 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e  l(pAr, "SAVEPOIN
2d8a0 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72  T ar;");.  if( r
2d8b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2d8c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d  eturn rc;.  zTem
2d8d0 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28  p[0] = 0; .  if(
2d8e0 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20   pAr->bZip ){.  
2d8f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2d900 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74  the zipfile virt
2d910 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65  ual table, if ne
2d920 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
2d930 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  f( pAr->zFile ){
2d940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
2d950 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73  int64 r;.      s
2d960 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2d970 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b  s(sizeof(r),&r);
2d980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2d990 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2d9a0 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70  Temp),zTemp,"zip
2d9b0 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20  %016llx",r);.   
2d9c0 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b     zTab = zTemp;
2d9d0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2d9e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2d9f0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
2da00 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
2da10 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66  mp.%s USING zipf
2da20 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20  ile(%Q)",.      
2da30 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46     zTab, pAr->zF
2da40 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ile.      );.   
2da50 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2da60 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
2da70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da80 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zSql);.    }els
2da90 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20  e{.      zTab = 
2daa0 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d  "zip";.    }.  }
2dab0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
2dac0 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
2dad0 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a  e for an SQLAR *
2dae0 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71  /.    zTab = "sq
2daf0 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55  lar";.    if( bU
2db00 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pdate==0 ){.    
2db10 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2db20 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20  (pAr, zDrop);.  
2db30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2db40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2db50 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b  _ar_transaction;
2db60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2db70 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2db80 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  Create);.  }.  i
2db90 66 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67 65  f( bOnlyIfChange
2dba0 64 20 29 7b 0a 20 20 20 20 7a 45 78 69 73 74 73  d ){.    zExists
2dbb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2dbc0 74 66 28 0a 20 20 20 20 20 20 22 20 41 4e 44 20  tf(.      " AND 
2dbd0 4e 4f 54 20 45 58 49 53 54 53 28 22 0a 20 20 20  NOT EXISTS(".   
2dbe0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31         "SELECT 1
2dbf0 20 46 52 4f 4d 20 25 73 20 41 53 20 6d 65 6d 22   FROM %s AS mem"
2dc00 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45  .          " WHE
2dc10 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69 73 6b  RE mem.name=disk
2dc20 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20 20  .name".         
2dc30 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69 6d 65   " AND mem.mtime
2dc40 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20 20 20  =disk.mtime".   
2dc50 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d         " AND mem
2dc60 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64 65 29  .mode=disk.mode)
2dc70 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ", zTab);.  }els
2dc80 65 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20 3d  e{.    zExists =
2dc90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2dca0 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ("");.  }.  if( 
2dcb0 7a 45 78 69 73 74 73 3d 3d 30 20 29 20 72 63 20  zExists==0 ) rc 
2dcc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2dcd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
2dce0 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51  ->nArg && rc==SQ
2dcf0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
2dd00 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d     char *zSql2 =
2dd10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2dd20 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d  (zInsertFmt[pAr-
2dd30 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20  >bZip], zTab,.  
2dd40 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62        pAr->bVerb
2dd50 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74  ose ? "shell_put
2dd60 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61  snl(name)" : "na
2dd70 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72  me",.        pAr
2dd80 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d  ->azArg[i], pAr-
2dd90 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74 73 29 3b  >zDir, zExists);
2dda0 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
2ddb0 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b  Sql(pAr, zSql2);
2ddc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ddd0 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e  e(zSql2);.  }.en
2dde0 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
2ddf0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
2de00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2de10 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64  ite3_exec(pAr->d
2de20 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  b, "ROLLBACK TO 
2de30 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22  ar; RELEASE ar;"
2de40 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  , 0, 0, 0);.  }e
2de50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72  lse{.    rc = ar
2de60 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45  ExecSql(pAr, "RE
2de70 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 20  LEASE ar;");.   
2de80 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 26   if( pAr->bZip &
2de90 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a  & pAr->zFile ){.
2dea0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
2deb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 52  ite3_mprintf("DR
2dec0 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54  OP TABLE %s", zT
2ded0 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45 78  emp);.      arEx
2dee0 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29  ecSql(pAr, zSql)
2def0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2df00 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2df10 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
2df20 66 72 65 65 28 7a 45 78 69 73 74 73 29 3b 0a 20  free(zExists);. 
2df30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2df40 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2df50 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f 74  ion of ".ar" dot
2df60 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
2df70 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d  tic int arDotCom
2df80 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61  mand(.  ShellSta
2df90 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
2dfa0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2dfb0 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
2dfc0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f  ate */.  int fro
2dfd0 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20 20  mCmdLine,       
2dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2dff0 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c   if -A command-l
2e000 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20  ine option, not 
2e010 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61  .ar cmd */.  cha
2e020 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
2e030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e040 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
2e050 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
2e060 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2e070 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e090 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2e0a0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
2e0b0 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20  .){.  ArCommand 
2e0c0 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  cmd;.  int rc;. 
2e0d0 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c   memset(&cmd, 0,
2e0e0 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20   sizeof(cmd));. 
2e0f0 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65   cmd.fromCmdLine
2e100 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a   = fromCmdLine;.
2e110 20 20 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f    rc = arParseCo
2e120 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72  mmand(azArg, nAr
2e130 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20  g, &cmd);.  if( 
2e140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e150 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79 70 65  .    int eDbType
2e160 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
2e170 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20  SPEC;.    cmd.p 
2e180 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63 6d  = pState;.    cm
2e190 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64  d.db = pState->d
2e1a0 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a  b;.    if( cmd.z
2e1b0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65 44  File ){.      eD
2e1c0 62 54 79 70 65 20 3d 20 64 65 64 75 63 65 44 61  bType = deduceDa
2e1d0 74 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e 7a  tabaseType(cmd.z
2e1e0 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65  File, 1);.    }e
2e1f0 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54 79  lse{.      eDbTy
2e200 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65  pe = pState->ope
2e210 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20  nMode;.    }.   
2e220 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53 48   if( eDbType==SH
2e230 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
2e240 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d   ){.      if( cm
2e250 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45  d.eCmd==AR_CMD_E
2e260 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43  XTRACT || cmd.eC
2e270 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20  md==AR_CMD_LIST 
2e280 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
2e290 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  md.zFile==0 ){. 
2e2a0 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72           cmd.zSr
2e2b0 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2e2c0 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b  _mprintf("zip");
2e2d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e2e0 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53            cmd.zS
2e2f0 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
2e300 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69  3_mprintf("zipfi
2e310 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69  le(%Q)", cmd.zFi
2e320 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
2e330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
2e340 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d  .bZip = 1;.    }
2e350 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69  else if( cmd.zFi
2e360 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  le ){.      int 
2e370 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  flags;.      if(
2e380 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20 65   cmd.bAppend ) e
2e390 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f  DbType = SHELL_O
2e3a0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20  PEN_APPENDVFS;. 
2e3b0 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d       if( cmd.eCm
2e3c0 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  d==AR_CMD_CREATE
2e3d0 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52   || cmd.eCmd==AR
2e3e0 5f 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20 20 20  _CMD_INSERT .   
2e3f0 20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64 2e 65          || cmd.e
2e400 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
2e410 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  TE ){.        fl
2e420 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
2e430 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2e440 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
2e450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e460 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
2e470 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e480 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
2e490 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20   cmd.db = 0;.   
2e4a0 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52     if( cmd.bDryR
2e4b0 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
2e4c0 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  f8_printf(pState
2e4d0 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20  ->out, "-- open 
2e4e0 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c  database '%s'%s\
2e4f0 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20  n", cmd.zFile,. 
2e500 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54              eDbT
2e510 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
2e520 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73  APPENDVFS ? " us
2e530 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a  ing 'apndvfs'" :
2e540 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   "");.      }.  
2e550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e560 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69  _open_v2(cmd.zFi
2e570 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61  le, &cmd.db, fla
2e580 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  gs, .           
2e590 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
2e5a0 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
2e5b0 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29  ? "apndvfs" : 0)
2e5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2e5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e5e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e5f0 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
2e600 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28   open file: %s (
2e610 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  %s)\n", .       
2e620 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20       cmd.zFile, 
2e630 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63  sqlite3_errmsg(c
2e640 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29  md.db).        )
2e650 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2e660 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20  nd_ar_command;. 
2e670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2e680 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
2e690 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a  (cmd.db, 0, 0);.
2e6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71        sqlite3_sq
2e6b0 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c  lar_init(cmd.db,
2e6c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2e6d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
2e6e0 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73  ction(cmd.db, "s
2e6f0 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c  hell_putsnl", 1,
2e700 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d   SQLITE_UTF8, cm
2e710 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d.p,.           
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63     shellPutsFunc
2e740 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a  , 0, 0);..    }.
2e750 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63      if( cmd.zSrc
2e760 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e  Table==0 && cmd.
2e770 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e 65  bZip==0 && cmd.e
2e780 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c 50  Cmd!=AR_CMD_HELP
2e790 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d   ){.      if( cm
2e7a0 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43  d.eCmd!=AR_CMD_C
2e7b0 52 45 41 54 45 0a 20 20 20 20 20 20 20 26 26 20  REATE.       && 
2e7c0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2e7d0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d  lumn_metadata(cm
2e7e0 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22  d.db,0,"sqlar","
2e7f0 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29  name",0,0,0,0,0)
2e800 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e810 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e820 64 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20  derr, "database 
2e830 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
2e840 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c   an 'sqlar' tabl
2e850 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e\n");.        r
2e860 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2e870 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2e880 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20  nd_ar_command;. 
2e890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
2e8a0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2e8b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71  ite3_mprintf("sq
2e8c0 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lar");.    }..  
2e8d0 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43    switch( cmd.eC
2e8e0 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  md ){.      case
2e8f0 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a   AR_CMD_CREATE:.
2e900 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
2e910 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
2e920 6d 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20 30 29  mand(&cmd, 0, 0)
2e930 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2e940 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
2e950 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20  CMD_EXTRACT:.   
2e960 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72       rc = arExtr
2e970 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29  actCommand(&cmd)
2e980 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2e990 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
2e9a0 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20  CMD_LIST:.      
2e9b0 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d    rc = arListCom
2e9c0 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
2e9d0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2e9e0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45    case AR_CMD_HE
2e9f0 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73  LP:.        arUs
2ea00 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29  age(pState->out)
2ea10 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2ea20 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
2ea30 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20  CMD_INSERT:.    
2ea40 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2ea50 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2ea60 28 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a 20 20  (&cmd, 1, 0);.  
2ea70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2ea80 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2ea90 20 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64       assert( cmd
2eaa0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50  .eCmd==AR_CMD_UP
2eab0 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  DATE );.        
2eac0 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55  rc = arCreateOrU
2ead0 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d  pdateCommand(&cm
2eae0 64 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  d, 1, 1);.      
2eaf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2eb00 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e   }.end_ar_comman
2eb10 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21  d:.  if( cmd.db!
2eb20 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20  =pState->db ){. 
2eb30 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e     close_db(cmd.
2eb40 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
2eb50 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63  e3_free(cmd.zSrc
2eb60 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72  Table);..  retur
2eb70 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  n rc;.}./* End o
2eb80 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22  f the ".archive"
2eb90 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
2eba0 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a  d logic.********
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 2a 2a 2a 2a 2a  ****************
2ebf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2ec00 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2ec10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ec20 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
2ec30 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
2ec40 5a 4c 49 42 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ZLIB) */../*.** 
2ec50 49 66 20 28 2a 70 52 63 29 20 69 73 20 6e 6f 74  If (*pRc) is not
2ec60 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2ec70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ec80 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2ec90 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
2eca0 77 69 73 65 2c 20 74 68 65 20 53 51 4c 20 73 74  wise, the SQL st
2ecb0 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65  atement or state
2ecc0 6d 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20 61 72  ments in zSql ar
2ecd0 65 20 65 78 65 63 75 74 65 64 20 75 73 69 6e 67  e executed using
2ece0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2ecf0 6e 65 63 74 69 6f 6e 20 64 62 20 61 6e 64 20 74  nection db and t
2ed00 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77 72  he error code wr
2ed10 69 74 74 65 6e 20 74 6f 20 2a 70 52 63 20 62 65  itten to *pRc be
2ed20 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66 75 6e  fore.** this fun
2ed30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
2ed40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
2ed50 65 6c 6c 45 78 65 63 28 73 71 6c 69 74 65 33 20  ellExec(sqlite3 
2ed60 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20 63  *db, int *pRc, c
2ed70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
2ed80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  {.  int rc = *pR
2ed90 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  c;.  if( rc==SQL
2eda0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
2edb0 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2edc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2edd0 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
2ede0 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20   0, &zErr);.    
2edf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ee00 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  K ){.      raw_p
2ee10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
2ee20 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
2ee30 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20   zErr);.    }.  
2ee40 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d    *pRc = rc;.  }
2ee50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
2ee60 68 65 6c 6c 45 78 65 63 28 29 2c 20 65 78 63 65  hellExec(), exce
2ee70 70 74 20 74 68 61 74 20 7a 46 6d 74 20 69 73 20  pt that zFmt is 
2ee80 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65  a printf() style
2ee90 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 0a   format string..
2eea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2eeb0 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 73  hellExecPrintf(s
2eec0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2eed0 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
2eee0 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
2eef0 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
2ef00 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
2ef10 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73  OK ){.    va_lis
2ef20 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61  t ap;.    va_sta
2ef30 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
2ef40 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
2ef50 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
2ef60 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2ef70 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
2ef80 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
2ef90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2efa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
2efb0 65 6c 6c 45 78 65 63 28 64 62 2c 20 70 52 63 2c  ellExec(db, pRc,
2efc0 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   z);.    }.    s
2efd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
2efe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
2eff0 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49  *pRc is not SQLI
2f000 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
2f010 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2f020 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2f030 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
2f040 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2f050 61 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c  ade to allocate,
2f060 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
2f070 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
2f080 20 61 20 62 75 66 66 65 72 20 6e 42 79 74 65 20   a buffer nByte 
2f090 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49  bytes in size. I
2f0a0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
2f0b0 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73  ccurs, *pRc is s
2f0c0 65 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54 45 5f  et.** to SQLITE_
2f0d0 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20 72  NOMEM and NULL r
2f0e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2f0f0 69 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c 4d 61  ic void *shellMa
2f100 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20 73  lloc(int *pRc, s
2f110 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
2f120 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  te){.  void *pRe
2f130 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
2f140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f150 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
2f160 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
2f170 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
2f180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ==0 ){.      *pR
2f190 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2f1a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f1b0 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
2f1c0 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  0, nByte);.    }
2f1d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
2f1e0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  et;.}../*.** If 
2f1f0 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49  *pRc is not SQLI
2f200 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
2f210 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2f220 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2f230 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
2f240 20 7a 46 6d 74 20 69 73 20 74 72 65 61 74 65 64   zFmt is treated
2f250 20 61 73 20 61 20 70 72 69 6e 74 66 28 29 20 73   as a printf() s
2f260 74 79 6c 65 20 73 74 72 69 6e 67 2e 20 54 68 65  tyle string. The
2f270 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 66 6f   result of.** fo
2f280 72 6d 61 74 74 69 6e 67 20 69 74 20 61 6c 6f 6e  rmatting it alon
2f290 67 20 77 69 74 68 20 61 6e 79 20 74 72 61 69 6c  g with any trail
2f2a0 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 69 73  ing arguments is
2f2b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
2f2c0 0a 2a 2a 20 62 75 66 66 65 72 20 6f 62 74 61 69  .** buffer obtai
2f2d0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2f2e0 5f 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64 20 70  _malloc(), and p
2f2f0 6f 69 6e 74 65 72 20 74 6f 20 77 68 69 63 68 20  ointer to which 
2f300 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
2f310 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
2f320 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
2f330 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
2f340 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
2f350 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20 61  uffer.** using a
2f360 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2f370 5f 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a 2a 20  _free()..** .** 
2f380 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
2f390 6f 63 63 75 72 73 2c 20 28 2a 70 52 63 29 20 69  occurs, (*pRc) i
2f3a0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
2f3b0 4e 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55 4c 4c  NOMEM and a NULL
2f3c0 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72 65 74   .** pointer ret
2f3d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2f3e0 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50 72 69   char *shellMPri
2f3f0 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f  ntf(int *pRc, co
2f400 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2f410 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20  ...){.  char *z 
2f420 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
2f430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f440 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2f450 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2f460 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  Fmt);.    z = sq
2f470 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2f480 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  Fmt, ap);.    va
2f490 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66  _end(ap);.    if
2f4a0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
2f4b0 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
2f4c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
2f4d0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
2f4e0 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  .** When running
2f4f0 20 74 68 65 20 22 2e 72 65 63 6f 76 65 72 22 20   the ".recover" 
2f500 63 6f 6d 6d 61 6e 64 2c 20 65 61 63 68 20 6f 75  command, each ou
2f510 74 70 75 74 20 74 61 62 6c 65 2c 20 61 6e 64 20  tput table, and 
2f520 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 6f  the special.** o
2f530 72 70 68 61 6e 65 64 20 72 6f 77 20 74 61 62 6c  rphaned row tabl
2f540 65 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  e if it is requi
2f550 72 65 64 2c 20 69 73 20 72 65 70 72 65 73 65 6e  red, is represen
2f560 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
2f570 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
2f580 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 2e 0a 2a  lowing struct..*
2f590 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2f5a0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 52 65   RecoverTable Re
2f5b0 63 6f 76 65 72 54 61 62 6c 65 3b 0a 73 74 72 75  coverTable;.stru
2f5c0 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20  ct RecoverTable 
2f5d0 7b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65  {.  char *zQuote
2f5e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2f5f0 20 20 20 20 2f 2a 20 51 75 6f 74 65 64 20 76 65      /* Quoted ve
2f600 72 73 69 6f 6e 20 6f 66 20 74 61 62 6c 65 20 6e  rsion of table n
2f610 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ame */.  int nCo
2f620 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2f630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f640 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2f650 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
2f660 20 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20 20 20 20   **azlCol;      
2f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2f680 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6c  rray of column l
2f690 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ists */.  int iP
2f6a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2f6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2f6c0 65 78 20 6f 66 20 49 50 4b 20 63 6f 6c 75 6d 6e  ex of IPK column
2f6d0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 72   */.};../*.** Fr
2f6e0 65 65 20 61 20 52 65 63 6f 76 65 72 54 61 62 6c  ee a RecoverTabl
2f6f0 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  e object allocat
2f700 65 64 20 62 79 20 72 65 63 6f 76 65 72 46 69 6e  ed by recoverFin
2f710 64 54 61 62 6c 65 28 29 20 6f 72 0a 2a 2a 20 72  dTable() or.** r
2f720 65 63 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c  ecoverOrphanTabl
2f730 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2f740 6f 69 64 20 72 65 63 6f 76 65 72 46 72 65 65 54  oid recoverFreeT
2f750 61 62 6c 65 28 52 65 63 6f 76 65 72 54 61 62 6c  able(RecoverTabl
2f760 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 66 28 20  e *pTab){.  if( 
2f770 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
2f780 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 7a  te3_free(pTab->z
2f790 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 69 66 28  Quoted);.    if(
2f7a0 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 29 7b   pTab->azlCol ){
2f7b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2f7c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
2f7d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
2f7e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f7f0 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c  3_free(pTab->azl
2f800 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  Col[i]);.      }
2f810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2f820 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c  ree(pTab->azlCol
2f830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2f840 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b  ite3_free(pTab);
2f850 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2f860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2f870 20 6e 6f 2d 6f 70 20 69 66 20 28 2a 70 52 63 29   no-op if (*pRc)
2f880 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
2f890 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c  K when it is cal
2f8a0 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  led..** Otherwis
2f8b0 65 2c 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 20  e, it allocates 
2f8c0 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 52 65  and returns a Re
2f8d0 63 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63  coverTable objec
2f8e0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  t based on the.*
2f8f0 2a 20 66 69 6e 61 6c 20 66 6f 75 72 20 61 72 67  * final four arg
2f900 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
2f910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2f920 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
2f930 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
2f940 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
2f950 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
2f960 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
2f970 20 75 73 69 6e 67 0a 2a 2a 20 72 65 63 6f 76 65   using.** recove
2f980 72 46 72 65 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  rFreeTable()..*/
2f990 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54  .static RecoverT
2f9a0 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4e 65 77  able *recoverNew
2f9b0 54 61 62 6c 65 28 0a 20 20 69 6e 74 20 2a 70 52  Table(.  int *pR
2f9c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2f9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2f9e0 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
2f9f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2fa00 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
2fa10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2fa20 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
2fa30 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
2fa40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 52 45            /* CRE
2fa50 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2fa60 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e  ent */.  int bIn
2fa70 74 6b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 43 6f  tkey, .  int nCo
2fa80 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  l.){.  sqlite3 *
2fa90 64 62 74 6d 70 20 3d 20 30 3b 20 20 20 20 20 20  dbtmp = 0;      
2faa0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2fab0 33 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 65 73  3 handle for tes
2fac0 74 69 6e 67 20 43 52 45 41 54 45 20 54 41 42 4c  ting CREATE TABL
2fad0 45 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  E */.  int rc = 
2fae0 2a 70 52 63 3b 0a 20 20 52 65 63 6f 76 65 72 54  *pRc;.  RecoverT
2faf0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
2fb00 0a 20 20 70 54 61 62 20 3d 20 28 52 65 63 6f 76  .  pTab = (Recov
2fb10 65 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c 4d 61  erTable*)shellMa
2fb20 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66  lloc(&rc, sizeof
2fb30 28 52 65 63 6f 76 65 72 54 61 62 6c 65 29 29 3b  (RecoverTable));
2fb40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fb50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2fb60 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nSqlCol = 0;.   
2fb70 20 69 6e 74 20 62 53 71 6c 49 6e 74 6b 65 79 20   int bSqlIntkey 
2fb80 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2fb90 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
2fba0 3b 0a 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20  ;.    .    rc = 
2fbb0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 22 2c  sqlite3_open("",
2fbc0 20 26 64 62 74 6d 70 29 3b 0a 20 20 20 20 69 66   &dbtmp);.    if
2fbd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fbe0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2fbf0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70  lite3_exec(dbtmp
2fc00 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
2fc10 6c 65 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 22 2c  le_schema = on",
2fc20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
2fc30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2fc40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fc50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2fc60 63 28 64 62 74 6d 70 2c 20 7a 53 71 6c 2c 20 30  c(dbtmp, zSql, 0
2fc70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
2fc80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
2fc90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ROR ){.        r
2fca0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fcb0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69         goto fini
2fcc0 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  shed;.      }.  
2fcd0 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 50 72 65    }.    shellPre
2fce0 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
2fcf0 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
2fd00 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2fd10 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 72  count(*) FROM pr
2fd20 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28  agma_table_info(
2fd30 25 51 29 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  %Q)", zName.    
2fd40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2fd50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
2fd60 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2fd70 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
2fd80 20 20 20 20 20 6e 53 71 6c 43 6f 6c 20 3d 20 73       nSqlCol = s
2fd90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2fda0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2fdb0 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2fdc0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
2fdd0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
2fde0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c  QLITE_OK || nSql
2fdf0 43 6f 6c 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  Col<nCol ){.    
2fe00 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b    goto finished;
2fe10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 68 65 6c  .    }..    shel
2fe20 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 64  lPreparePrintf(d
2fe30 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d  btmp, &rc, &pStm
2fe40 74 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  t, .      "SELEC
2fe50 54 20 28 22 0a 20 20 20 20 20 20 22 20 20 53 45  T (".      "  SE
2fe60 4c 45 43 54 20 73 75 62 73 74 72 28 64 61 74 61  LECT substr(data
2fe70 2c 31 2c 31 29 3d 3d 58 27 30 44 27 20 46 52 4f  ,1,1)==X'0D' FRO
2fe80 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20  M sqlite_dbpage 
2fe90 57 48 45 52 45 20 70 67 6e 6f 3d 72 6f 6f 74 70  WHERE pgno=rootp
2fea0 61 67 65 22 0a 20 20 20 20 20 20 22 29 20 46 52  age".      ") FR
2feb0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2fec0 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51   WHERE name = %Q
2fed0 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  ", zName.    );.
2fee0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fef0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
2ff00 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2ff10 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
2ff20 20 20 62 53 71 6c 49 6e 74 6b 65 79 20 3d 20 73    bSqlIntkey = s
2ff30 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2ff40 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2ff50 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2ff60 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
2ff70 3b 0a 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b  ;..    if( bIntk
2ff80 65 79 3d 3d 62 53 71 6c 49 6e 74 6b 65 79 20 29  ey==bSqlIntkey )
2ff90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
2ffa0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ffb0 2a 7a 50 6b 20 3d 20 22 5f 72 6f 77 69 64 5f 22  *zPk = "_rowid_"
2ffc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ffd0 73 74 6d 74 20 2a 70 50 6b 46 69 6e 64 65 72 20  stmt *pPkFinder 
2ffe0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  = 0;..      /* I
2fff0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
30000 6b 65 79 20 74 61 62 6c 65 20 61 6e 64 20 74 68  key table and th
30010 65 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45  ere is an INTEGE
30020 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  R PRIMARY KEY,. 
30030 20 20 20 20 20 2a 2a 20 73 65 74 20 7a 50 6b 20       ** set zPk 
30040 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  to the name of t
30050 68 65 20 50 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e  he PK column, an
30060 64 20 70 54 61 62 2d 3e 69 50 6b 20 74 6f 20 74  d pTab->iPk to t
30070 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  he index.      *
30080 2a 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c  * of the column,
30090 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 73 20 61   where columns a
300a0 72 65 20 30 2d 6e 75 6d 62 65 72 65 64 20 66 72  re 0-numbered fr
300b0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
300c0 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69  ..      ** Or, i
300d0 66 20 74 68 69 73 20 69 73 20 61 20 57 49 54 48  f this is a WITH
300e0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
300f0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
30100 6f 20 49 50 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20  o IPK column,.  
30110 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 7a 50 6b      ** leave zPk
30120 20 61 73 20 22 5f 72 6f 77 69 64 5f 22 20 61 6e   as "_rowid_" an
30130 64 20 70 54 61 62 2d 3e 69 50 6b 20 61 74 20 2d  d pTab->iPk at -
30140 32 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  2.  */.      pTa
30150 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20  b->iPk = -2;.   
30160 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29     if( bIntkey )
30170 7b 0a 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50  {.        shellP
30180 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74  reparePrintf(dbt
30190 6d 70 2c 20 26 72 63 2c 20 26 70 50 6b 46 69 6e  mp, &rc, &pPkFin
301a0 64 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  der, .          
301b0 22 53 45 4c 45 43 54 20 63 69 64 2c 20 6e 61 6d  "SELECT cid, nam
301c0 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61  e FROM pragma_ta
301d0 62 6c 65 5f 69 6e 66 6f 28 25 51 29 20 22 0a 20  ble_info(%Q) ". 
301e0 20 20 20 20 20 20 20 20 20 22 20 20 57 48 45 52           "  WHER
301f0 45 20 70 6b 3d 31 20 41 4e 44 20 74 79 70 65 3d  E pk=1 AND type=
30200 27 69 6e 74 65 67 65 72 27 20 43 4f 4c 4c 41 54  'integer' COLLAT
30210 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
30220 20 20 20 20 22 20 20 41 4e 44 20 4e 4f 54 20 45      "  AND NOT E
30230 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 63 69  XISTS (SELECT ci
30240 64 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61  d FROM pragma_ta
30250 62 6c 65 5f 69 6e 66 6f 28 25 51 29 20 57 48 45  ble_info(%Q) WHE
30260 52 45 20 70 6b 3d 32 29 22 0a 20 20 20 20 20 20  RE pk=2)".      
30270 20 20 20 20 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61      , zName, zNa
30280 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
30290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
302a0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
302b0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
302c0 74 65 70 28 70 50 6b 46 69 6e 64 65 72 29 20 29  tep(pPkFinder) )
302d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
302e0 2d 3e 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f  ->iPk = sqlite3_
302f0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 6b 46 69  column_int(pPkFi
30300 6e 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  nder, 0);.      
30310 20 20 20 20 7a 50 6b 20 3d 20 28 63 6f 6e 73 74      zPk = (const
30320 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
30330 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 50 6b 46 69  olumn_text(pPkFi
30340 6e 64 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  nder, 1);.      
30350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
30360 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64     pTab->zQuoted
30370 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
30380 26 72 63 2c 20 22 25 51 22 2c 20 7a 4e 61 6d 65  &rc, "%Q", zName
30390 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
303a0 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zlCol = (char**)
303b0 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c  shellMalloc(&rc,
303c0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
303d0 20 28 6e 53 71 6c 43 6f 6c 2b 31 29 29 3b 0a 20   (nSqlCol+1));. 
303e0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
303f0 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a 20 20 20 20  = nSqlCol;..    
30400 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29 7b    if( bIntkey ){
30410 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
30420 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c  zlCol[0] = shell
30430 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25 51  MPrintf(&rc, "%Q
30440 22 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d  ", zPk);.      }
30450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
30460 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20  ab->azlCol[0] = 
30470 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63  shellMPrintf(&rc
30480 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , "");.      }. 
30490 20 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20       i = 1;.    
304a0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
304b0 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c  intf(dbtmp, &rc,
304c0 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20   &pStmt, .      
304d0 20 20 20 20 22 53 45 4c 45 43 54 20 25 51 20 7c      "SELECT %Q |
304e0 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 6e  | group_concat(n
304f0 61 6d 65 2c 20 27 2c 20 27 29 20 22 0a 20 20 20  ame, ', ') ".   
30500 20 20 20 20 20 20 20 22 20 20 46 49 4c 54 45 52         "  FILTER
30510 20 28 57 48 45 52 45 20 63 69 64 21 3d 25 64 29   (WHERE cid!=%d)
30520 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
30530 25 73 20 63 69 64 29 20 22 0a 20 20 20 20 20 20  %s cid) ".      
30540 20 20 20 20 22 46 52 4f 4d 20 70 72 61 67 6d 61      "FROM pragma
30550 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22  _table_info(%Q)"
30560 2c 20 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  , .          bIn
30570 74 6b 65 79 20 3f 20 22 2c 20 22 20 3a 20 22 22  tkey ? ", " : ""
30580 2c 20 70 54 61 62 2d 3e 69 50 6b 2c 20 0a 20 20  , pTab->iPk, .  
30590 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79 20          bIntkey 
305a0 3f 20 22 22 20 3a 20 22 28 43 41 53 45 20 57 48  ? "" : "(CASE WH
305b0 45 4e 20 70 6b 3d 30 20 54 48 45 4e 20 31 30 30  EN pk=0 THEN 100
305c0 30 30 30 30 20 45 4c 53 45 20 70 6b 20 45 4e 44  0000 ELSE pk END
305d0 29 2c 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ), ",.          
305e0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
305f0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
30600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
30610 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
30620 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
30630 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
30640 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
30650 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
30660 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
30670 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
30680 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20  pTab->azlCol[i] 
30690 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26  = shellMPrintf(&
306a0 72 63 2c 20 22 25 73 25 73 22 2c 20 70 54 61 62  rc, "%s%s", pTab
306b0 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 2c 20 7a 54 65  ->azlCol[0], zTe
306c0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  xt);.        i++
306d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
306e0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
306f0 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  c, pStmt);..    
30700 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
30710 26 72 63 2c 20 70 50 6b 46 69 6e 64 65 72 29 3b  &rc, pPkFinder);
30720 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e  .    }.  }.. fin
30730 69 73 68 65 64 3a 0a 20 20 73 71 6c 69 74 65 33  ished:.  sqlite3
30740 5f 63 6c 6f 73 65 28 64 62 74 6d 70 29 3b 0a 20  _close(dbtmp);. 
30750 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69 66   *pRc = rc;.  if
30760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30770 29 7b 0a 20 20 20 20 72 65 63 6f 76 65 72 46 72  ){.    recoverFr
30780 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  eeTable(pTab);. 
30790 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d     pTab = 0;.  }
307a0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
307b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
307c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
307d0 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 73   to search the s
307e0 63 68 65 6d 61 20 72 65 63 6f 76 65 72 65 64 20  chema recovered 
307f0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 71 6c 69  from the.** sqli
30800 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30810 6f 66 20 74 68 65 20 28 70 6f 73 73 69 62 6c 79  of the (possibly
30820 29 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  ) corrupt databa
30830 73 65 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66  se as part.** of
30840 20 61 20 22 2e 72 65 63 6f 76 65 72 22 20 63 6f   a ".recover" co
30850 6d 6d 61 6e 64 2e 20 53 70 65 63 69 66 69 63 61  mmand. Specifica
30860 6c 6c 79 2c 20 66 6f 72 20 61 20 74 61 62 6c 65  lly, for a table
30870 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65 0a   with root page.
30880 2a 2a 20 69 52 6f 6f 74 20 61 6e 64 20 61 74 20  ** iRoot and at 
30890 6c 65 61 73 74 20 6e 43 6f 6c 20 63 6f 6c 75 6d  least nCol colum
308a0 6e 73 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ns. Additionally
308b0 2c 20 69 66 20 62 49 6e 74 6b 65 79 20 69 73 20  , if bIntkey is 
308c0 30 2c 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  0, the.** table 
308d0 6d 75 73 74 20 62 65 20 61 20 57 49 54 48 4f 55  must be a WITHOU
308e0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 6f  T ROWID table, o
308f0 72 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6e  r if non-zero, n
30900 6f 74 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 6f  ot one of.** tho
30910 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  se..**.** If a t
30920 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 61  able is found, a
30930 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29   (RecoverTable*)
30940 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
30950 6e 65 64 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 6e  ned. Or, if.** n
30960 6f 20 73 75 63 68 20 74 61 62 6c 65 20 69 73 20  o such table is 
30970 66 6f 75 6e 64 2c 20 62 75 74 20 62 49 6e 74 6b  found, but bIntk
30980 65 79 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ey is false and 
30990 69 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a  iRoot is the .**
309a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e   root page of an
309b0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 72 65   index in the re
309c0 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c 20  covered schema, 
309d0 74 68 65 6e 20 28 2a 70 62 4e 6f 6f 70 29 20 69  then (*pbNoop) i
309e0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 72 75 65  s.** set to true
309f0 20 61 6e 64 20 4e 55 4c 4c 20 72 65 74 75 72 6e   and NULL return
30a00 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ed. Or, if there
30a10 20 69 73 20 6e 6f 20 73 75 63 68 20 74 61 62 6c   is no such tabl
30a20 65 20 6f 72 0a 2a 2a 20 69 6e 64 65 78 2c 20 4e  e or.** index, N
30a30 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
30a40 61 6e 64 20 28 2a 70 62 4e 6f 6f 70 29 20 73 65  and (*pbNoop) se
30a50 74 20 74 6f 20 30 2c 20 69 6e 64 69 63 61 74 69  t to 0, indicati
30a60 6e 67 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ng that.** the c
30a70 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 77 72 69  aller should wri
30a80 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f  te data to the o
30a90 72 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f  rphans table..*/
30aa0 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54  .static RecoverT
30ab0 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 46 69 6e  able *recoverFin
30ac0 64 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c 53  dTable(.  ShellS
30ad0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
30ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65            /* She
30af0 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20  ll state object 
30b00 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  */.  int *pRc,  
30b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
30b30 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
30b40 69 6e 74 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  int iRoot,      
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b60 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
30b70 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62  table */.  int b
30b80 49 6e 74 6b 65 79 2c 20 20 20 20 20 20 20 20 20  Intkey,         
30b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30ba0 75 65 20 66 6f 72 20 61 6e 20 69 6e 74 6b 65 79  ue for an intkey
30bb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
30bc0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30be0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
30bf0 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
30c00 6e 74 20 2a 70 62 4e 6f 6f 70 20 20 20 20 20 20  nt *pbNoop      
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c20 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 69  * OUT: True if i
30c30 52 6f 6f 74 20 69 73 20 72 6f 6f 74 20 6f 66 20  Root is root of 
30c40 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 73 71  index */.){.  sq
30c50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
30c60 74 20 3d 20 30 3b 0a 20 20 52 65 63 6f 76 65 72  t = 0;.  Recover
30c70 54 61 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b  Table *pRet = 0;
30c80 0a 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30  .  int bNoop = 0
30c90 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
30ca0 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  zSql = 0;.  cons
30cb0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
30cc0 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  0;..  /* Search 
30cd0 74 68 65 20 72 65 63 6f 76 65 72 65 64 20 73 63  the recovered sc
30ce0 68 65 6d 61 20 66 6f 72 20 61 6e 20 6f 62 6a 65  hema for an obje
30cf0 63 74 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  ct with root pag
30d00 65 20 69 52 6f 6f 74 2e 20 2a 2f 0a 20 20 73 68  e iRoot. */.  sh
30d10 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
30d20 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63  (pState->db, pRc
30d30 2c 20 26 70 53 74 6d 74 2c 0a 20 20 20 20 20 20  , &pStmt,.      
30d40 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61  "SELECT type, na
30d50 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 72 65 63  me, sql FROM rec
30d60 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48 45  overy.schema WHE
30d70 52 45 20 72 6f 6f 74 70 61 67 65 3d 25 64 22 2c  RE rootpage=%d",
30d80 20 69 52 6f 6f 74 0a 20 20 29 3b 0a 20 20 77 68   iRoot.  );.  wh
30d90 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54  ile( *pRc==SQLIT
30da0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
30db0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
30dc0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63  (pStmt) ){.    c
30dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
30de0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
30df0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
30e00 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
30e10 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d     if( bIntkey==
30e20 30 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  0 && sqlite3_str
30e30 69 63 6d 70 28 7a 54 79 70 65 2c 20 22 69 6e 64  icmp(zType, "ind
30e40 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
30e50 20 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20   bNoop = 1;.    
30e60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30e70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
30e80 74 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22 74  tricmp(zType, "t
30e90 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
30ea0 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73     zName = (cons
30eb0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
30ec0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
30ed0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 53 71  t, 1);.      zSq
30ee0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
30ef0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30f00 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
30f10 20 20 20 20 20 20 70 52 65 74 20 3d 20 72 65 63        pRet = rec
30f20 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 70 52 63  overNewTable(pRc
30f30 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 2c 20 62  , zName, zSql, b
30f40 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 29 3b 0a 20  Intkey, nCol);. 
30f50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30f60 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 46 69  }.  }..  shellFi
30f70 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 53 74 6d  nalize(pRc, pStm
30f80 74 29 3b 0a 20 20 2a 70 62 4e 6f 6f 70 20 3d 20  t);.  *pbNoop = 
30f90 62 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  bNoop;.  return 
30fa0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
30fb0 65 74 75 72 6e 20 61 20 52 65 63 6f 76 65 72 54  eturn a RecoverT
30fc0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
30fd0 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6f 72 70  esenting the orp
30fe0 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hans table..*/.s
30ff0 74 61 74 69 63 20 52 65 63 6f 76 65 72 54 61 62  tatic RecoverTab
31000 6c 65 20 2a 72 65 63 6f 76 65 72 4f 72 70 68 61  le *recoverOrpha
31010 6e 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c 53  nTable(.  ShellS
31020 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
31030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65            /* She
31040 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20  ll state object 
31050 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  */.  int *pRc,  
31060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31070 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
31080 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
31090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73  const char *zLos
310a0 74 41 6e 64 46 6f 75 6e 64 2c 20 20 20 20 20 20  tAndFound,      
310b0 2f 2a 20 42 61 73 65 20 6e 61 6d 65 20 66 6f 72  /* Base name for
310c0 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 20 2a   orphans table *
310d0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 20 20 20  /.  int nCol    
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31100 20 75 73 65 72 20 64 61 74 61 20 63 6f 6c 75 6d   user data colum
31110 6e 73 20 2a 2f 0a 29 7b 0a 20 20 52 65 63 6f 76  ns */.){.  Recov
31120 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  erTable *pTab = 
31130 30 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 30  0;.  if( nCol>=0
31140 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45   && *pRc==SQLITE
31150 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
31160 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ;..    /* This b
31170 6c 6f 63 6b 20 64 65 74 65 72 6d 69 6e 65 73 20  lock determines 
31180 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
31190 6f 72 70 68 61 6e 20 74 61 62 6c 65 2e 20 54 68  orphan table. Th
311a0 65 20 70 72 65 66 65 72 65 64 0a 20 20 20 20 2a  e prefered.    *
311b0 2a 20 6e 61 6d 65 20 69 73 20 7a 4c 6f 73 74 41  * name is zLostA
311c0 6e 64 46 6f 75 6e 64 2e 20 42 75 74 20 69 66 20  ndFound. But if 
311d0 74 68 61 74 20 63 6c 61 73 68 65 73 20 77 69 74  that clashes wit
311e0 68 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65 0a 20  h another name. 
311f0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 63     ** in the rec
31200 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c 20 74  overed schema, t
31210 72 79 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64  ry zLostAndFound
31220 5f 30 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e  _0, zLostAndFoun
31230 64 5f 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73  d_1.    ** and s
31240 6f 20 6f 6e 20 75 6e 74 69 6c 20 61 20 6e 6f 6e  o on until a non
31250 2d 63 6c 61 73 68 69 6e 67 20 6e 61 6d 65 20 69  -clashing name i
31260 73 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 20  s found.  */.   
31270 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 0a 20   int iTab = 0;. 
31280 20 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20     char *zTab = 
31290 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63  shellMPrintf(pRc
312a0 2c 20 22 25 73 22 2c 20 7a 4c 6f 73 74 41 6e 64  , "%s", zLostAnd
312b0 46 6f 75 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  Found);.    sqli
312c0 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20  te3_stmt *pTest 
312d0 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c 6c 50 72  = 0;.    shellPr
312e0 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
312f0 2c 20 70 52 63 2c 0a 20 20 20 20 20 20 20 20 22  , pRc,.        "
31300 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 72 65  SELECT 1 FROM re
31310 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48  covery.schema WH
31320 45 52 45 20 6e 61 6d 65 3d 3f 22 2c 20 26 70 54  ERE name=?", &pT
31330 65 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  est.    );.    i
31340 66 28 20 70 54 65 73 74 20 29 20 73 71 6c 69 74  f( pTest ) sqlit
31350 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65  e3_bind_text(pTe
31360 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d 31 2c  st, 1, zTab, -1,
31370 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
31380 54 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  T);.    while( *
31390 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
313a0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
313b0 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65 73 74  lite3_step(pTest
313c0 29 20 29 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c  ) ){.      shell
313d0 52 65 73 65 74 28 70 52 63 2c 20 70 54 65 73 74  Reset(pRc, pTest
313e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
313f0 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 20  _free(zTab);.   
31400 20 20 20 7a 54 61 62 20 3d 20 73 68 65 6c 6c 4d     zTab = shellM
31410 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73 5f  Printf(pRc, "%s_
31420 25 64 22 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75  %d", zLostAndFou
31430 6e 64 2c 20 69 54 61 62 2b 2b 29 3b 0a 20 20 20  nd, iTab++);.   
31440 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
31450 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c 20 7a  text(pTest, 1, z
31460 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Tab, -1, SQLITE_
31470 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
31480 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
31490 69 7a 65 28 70 52 63 2c 20 70 54 65 73 74 29 3b  ize(pRc, pTest);
314a0 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 28 52 65  ..    pTab = (Re
314b0 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c  coverTable*)shel
314c0 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69 7a  lMalloc(pRc, siz
314d0 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65  eof(RecoverTable
314e0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
314f0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
31500 7a 51 75 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d  zQuoted = shellM
31510 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25 51 22  Printf(pRc, "%Q"
31520 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , zTab);.      p
31530 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Tab->nCol = nCol
31540 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
31550 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20 20 69 66  k = -2;.      if
31560 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( nCol>0 ){.    
31570 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c      pTab->azlCol
31580 20 3d 20 28 63 68 61 72 2a 2a 29 73 68 65 6c 6c   = (char**)shell
31590 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65  Malloc(pRc, size
315a0 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 6e 43 6f  of(char*) * (nCo
315b0 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69  l+1));.        i
315c0 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20  f( pTab->azlCol 
315d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
315e0 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e 43 6f 6c 5d 20  b->azlCol[nCol] 
315f0 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70  = shellMPrintf(p
31600 52 63 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  Rc, "");.       
31610 20 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 2d 31 3b     for(i=nCol-1;
31620 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
31630 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
31640 7a 6c 43 6f 6c 5b 69 5d 20 3d 20 73 68 65 6c 6c  zlCol[i] = shell
31650 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73  MPrintf(pRc, "%s
31660 2c 20 4e 55 4c 4c 22 2c 20 70 54 61 62 2d 3e 61  , NULL", pTab->a
31670 7a 6c 43 6f 6c 5b 69 2b 31 5d 29 3b 0a 20 20 20  zlCol[i+1]);.   
31680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31690 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
316a0 20 20 69 66 28 20 2a 70 52 63 21 3d 53 51 4c 49    if( *pRc!=SQLI
316b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
316c0 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
316d0 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  e(pTab);.       
316e0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
316f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31700 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
31710 65 2d 3e 6f 75 74 2c 20 0a 20 20 20 20 20 20 20  e->out, .       
31720 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
31730 4c 45 20 25 73 28 72 6f 6f 74 70 67 6e 6f 20 49  LE %s(rootpgno I
31740 4e 54 45 47 45 52 2c 20 22 0a 20 20 20 20 20 20  NTEGER, ".      
31750 20 20 20 20 20 20 22 70 67 6e 6f 20 49 4e 54 45        "pgno INTE
31760 47 45 52 2c 20 6e 66 69 65 6c 64 20 49 4e 54 45  GER, nfield INTE
31770 47 45 52 2c 20 69 64 20 49 4e 54 45 47 45 52 22  GER, id INTEGER"
31780 2c 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 0a  , pTab->zQuoted.
31790 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
317a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
317b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
317c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
317d0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2c 20 63  State->out, ", c
317e0 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  %d", i);.       
317f0 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
31800 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
31810 74 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  t, ");\n");.    
31820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
31830 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29  lite3_free(zTab)
31840 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
31850 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
31860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31870 61 6c 6c 65 64 20 74 6f 20 72 65 63 6f 76 65 72  alled to recover
31880 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
31890 61 74 61 62 61 73 65 2e 20 41 20 73 63 72 69 70  atabase. A scrip
318a0 74 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74 72 75 63  t.** to construc
318b0 74 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  t a new database
318c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
318d0 72 65 63 6f 76 65 72 65 64 20 64 61 74 61 20 69  recovered data i
318e0 73 20 6f 75 74 70 75 74 0a 2a 2a 20 6f 6e 20 73  s output.** on s
318f0 74 72 65 61 6d 20 70 53 74 61 74 65 2d 3e 6f 75  tream pState->ou
31900 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
31910 20 72 65 63 6f 76 65 72 44 61 74 61 62 61 73 65   recoverDatabase
31920 43 6d 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  Cmd(ShellState *
31930 70 53 74 61 74 65 2c 20 69 6e 74 20 6e 41 72 67  pState, int nArg
31940 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
31950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31960 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
31970 5f 73 74 6d 74 20 2a 70 4c 6f 6f 70 20 3d 20 30  _stmt *pLoop = 0
31980 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  ;        /* Loop
31990 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 6f   through all roo
319a0 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c  t pages */.  sql
319b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 61 67 65  ite3_stmt *pPage
319c0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  s = 0;       /* 
319d0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
319e0 20 70 61 67 65 73 20 69 6e 20 61 20 67 72 6f 75   pages in a grou
319f0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  p */.  sqlite3_s
31a00 74 6d 74 20 2a 70 43 65 6c 6c 73 20 3d 20 30 3b  tmt *pCells = 0;
31a10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
31a20 68 72 6f 75 67 68 20 61 6c 6c 20 63 65 6c 6c 73  hrough all cells
31a30 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
31a40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 63  const char *zRec
31a50 6f 76 65 72 79 44 62 20 3d 20 22 22 3b 20 20 20  overyDb = "";   
31a60 2f 2a 20 4e 61 6d 65 20 6f 66 20 22 72 65 63 6f  /* Name of "reco
31a70 76 65 72 79 22 20 64 61 74 61 62 61 73 65 20 2a  very" database *
31a80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
31a90 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 20 3d 20  zLostAndFound = 
31aa0 22 6c 6f 73 74 5f 61 6e 64 5f 66 6f 75 6e 64 22  "lost_and_found"
31ab0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
31ac0 20 6e 4f 72 70 68 61 6e 20 3d 20 2d 31 3b 0a 20   nOrphan = -1;. 
31ad0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70   RecoverTable *p
31ae0 4f 72 70 68 61 6e 20 3d 20 30 3b 0a 0a 20 20 69  Orphan = 0;..  i
31af0 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20 31  nt bFreelist = 1
31b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31b10 2a 20 30 20 69 66 20 2d 2d 66 72 65 65 6c 69 73  * 0 if --freelis
31b20 74 2d 63 6f 72 72 75 70 74 20 69 73 20 73 70 65  t-corrupt is spe
31b30 63 69 66 69 65 64 20 2a 2f 0a 20 20 66 6f 72 28  cified */.  for(
31b40 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
31b50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
31b60 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69   azArg[i];.    i
31b70 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b  nt n;.    if( z[
31b80 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
31b90 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
31ba0 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
31bb0 20 20 20 69 66 28 20 6e 3c 3d 31 37 20 26 26 20     if( n<=17 && 
31bc0 6d 65 6d 63 6d 70 28 22 2d 66 72 65 65 6c 69 73  memcmp("-freelis
31bd0 74 2d 63 6f 72 72 75 70 74 22 2c 20 7a 2c 20 6e  t-corrupt", z, n
31be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 46  )==0 ){.      bF
31bf0 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  reelist = 0;.   
31c00 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6e   }else.    if( n
31c10 3c 3d 31 32 20 26 26 20 6d 65 6d 63 6d 70 28 22  <=12 && memcmp("
31c20 2d 72 65 63 6f 76 65 72 79 2d 64 62 22 2c 20 7a  -recovery-db", z
31c30 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28 6e 41  , n)==0 && i<(nA
31c40 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69  rg-1) ){.      i
31c50 2b 2b 3b 0a 20 20 20 20 20 20 7a 52 65 63 6f 76  ++;.      zRecov
31c60 65 72 79 44 62 20 3d 20 61 7a 41 72 67 5b 69 5d  eryDb = azArg[i]
31c70 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
31c80 69 66 28 20 6e 3c 3d 31 35 20 26 26 20 6d 65 6d  if( n<=15 && mem
31c90 63 6d 70 28 22 2d 6c 6f 73 74 2d 61 6e 64 2d 66  cmp("-lost-and-f
31ca0 6f 75 6e 64 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20  ound", z, n)==0 
31cb0 26 26 20 69 3c 28 6e 41 72 67 2d 31 29 20 29 7b  && i<(nArg-1) ){
31cc0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
31cd0 20 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 20    zLostAndFound 
31ce0 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
31cf0 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
31d00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31d10 65 72 72 2c 20 22 75 6e 65 78 70 65 63 74 65 64  err, "unexpected
31d20 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
31d30 61 7a 41 72 67 5b 69 5d 29 3b 20 0a 20 20 20 20  azArg[i]); .    
31d40 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31d50 65 72 72 2c 20 22 6f 70 74 69 6f 6e 73 20 61 72  err, "options ar
31d60 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 61  e:\n");.      ra
31d70 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31d80 20 22 20 20 20 20 2d 2d 66 72 65 65 6c 69 73 74   "    --freelist
31d90 2d 63 6f 72 72 75 70 74 5c 6e 22 29 3b 0a 20 20  -corrupt\n");.  
31da0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
31db0 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 72 65  tderr, "    --re
31dc0 63 6f 76 65 72 79 2d 64 62 20 44 41 54 41 42 41  covery-db DATABA
31dd0 53 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 61  SE\n");.      ra
31de0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31df0 20 22 20 20 20 20 2d 2d 6c 6f 73 74 2d 61 6e 64   "    --lost-and
31e00 2d 66 6f 75 6e 64 20 54 41 42 4c 45 2d 4e 41 4d  -found TABLE-NAM
31e10 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  E\n");.      ret
31e20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
31e30 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69  ..  shellExecPri
31e40 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
31e50 26 72 63 2c 0a 20 20 20 20 2f 2a 20 41 74 74 61  &rc,.    /* Atta
31e60 63 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ch an in-memory 
31e70 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 27  database named '
31e80 72 65 63 6f 76 65 72 79 27 2e 20 43 72 65 61 74  recovery'. Creat
31e90 65 20 61 6e 20 69 6e 64 65 78 65 64 20 0a 20 20  e an indexed .  
31ea0 20 20 2a 2a 20 63 61 63 68 65 20 6f 66 20 74 68    ** cache of th
31eb0 65 20 73 71 6c 69 74 65 5f 64 62 70 74 72 20 76  e sqlite_dbptr v
31ec0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f  irtual table. */
31ed0 0a 20 20 20 20 22 41 54 54 41 43 48 20 25 51 20  .    "ATTACH %Q 
31ee0 41 53 20 72 65 63 6f 76 65 72 79 3b 22 0a 20 20  AS recovery;".  
31ef0 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46    "DROP TABLE IF
31f00 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72 79   EXISTS recovery
31f10 2e 64 62 70 74 72 3b 22 0a 20 20 20 20 22 44 52  .dbptr;".    "DR
31f20 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
31f30 54 53 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65  TS recovery.free
31f40 6c 69 73 74 3b 22 0a 20 20 20 20 22 44 52 4f 50  list;".    "DROP
31f50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
31f60 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 3b 22 0a   recovery.map;".
31f70 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
31f80 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76 65  IF EXISTS recove
31f90 72 79 2e 73 63 68 65 6d 61 3b 22 0a 20 20 20 20  ry.schema;".    
31fa0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 65  "CREATE TABLE re
31fb0 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 28  covery.freelist(
31fc0 70 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  pgno INTEGER PRI
31fd0 4d 41 52 59 20 4b 45 59 29 3b 22 2c 20 7a 52 65  MARY KEY);", zRe
31fe0 63 6f 76 65 72 79 44 62 0a 20 20 29 3b 0a 0a 20  coveryDb.  );.. 
31ff0 20 69 66 28 20 62 46 72 65 65 6c 69 73 74 20 29   if( bFreelist )
32000 7b 0a 20 20 20 20 73 68 65 6c 6c 45 78 65 63 28  {.    shellExec(
32010 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
32020 0a 20 20 20 20 20 20 22 57 49 54 48 20 74 72 75  .      "WITH tru
32030 6e 6b 28 70 67 6e 6f 29 20 41 53 20 28 22 0a 20  nk(pgno) AS (". 
32040 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73       "  SELECT s
32050 68 65 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20  hell_int32(".   
32060 20 20 20 22 20 20 20 20 20 20 28 53 45 4c 45 43     "      (SELEC
32070 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69  T data FROM sqli
32080 74 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20  te_dbpage WHERE 
32090 70 67 6e 6f 3d 31 29 2c 20 38 29 20 41 53 20 78  pgno=1), 8) AS x
320a0 20 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20   ".      "      
320b0 57 48 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20  WHERE x>0".     
320c0 20 22 20 20 20 20 55 4e 49 4f 4e 22 0a 20 20 20   "    UNION".   
320d0 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 68 65     "  SELECT she
320e0 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20  ll_int32(".     
320f0 20 22 20 20 20 20 20 20 28 53 45 4c 45 43 54 20   "      (SELECT 
32100 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65  data FROM sqlite
32110 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67  _dbpage WHERE pg
32120 6e 6f 3d 74 72 75 6e 6b 2e 70 67 6e 6f 29 2c 20  no=trunk.pgno), 
32130 30 29 20 41 53 20 78 20 22 0a 20 20 20 20 20 20  0) AS x ".      
32140 22 20 20 20 20 20 20 46 52 4f 4d 20 74 72 75 6e  "      FROM trun
32150 6b 20 57 48 45 52 45 20 78 3e 30 22 0a 20 20 20  k WHERE x>0".   
32160 20 20 20 22 29 2c 22 0a 20 20 20 20 20 20 22 66     "),".      "f
32170 72 65 65 6c 69 73 74 28 64 61 74 61 2c 20 6e 2c  reelist(data, n,
32180 20 66 72 65 65 70 67 6e 6f 29 20 41 53 20 28 22   freepgno) AS ("
32190 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
321a0 20 64 61 74 61 2c 20 73 68 65 6c 6c 5f 69 6e 74   data, shell_int
321b0 33 32 28 64 61 74 61 2c 20 31 29 2d 31 2c 20 74  32(data, 1)-1, t
321c0 2e 70 67 6e 6f 20 22 0a 20 20 20 20 20 20 22 20  .pgno ".      " 
321d0 20 20 20 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20       FROM trunk 
321e0 74 2c 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  t, sqlite_dbpage
321f0 20 73 20 57 48 45 52 45 20 73 2e 70 67 6e 6f 3d   s WHERE s.pgno=
32200 74 2e 70 67 6e 6f 22 0a 20 20 20 20 20 20 22 20  t.pgno".      " 
32210 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20     UNION ALL".  
32220 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 64 61      "  SELECT da
32230 74 61 2c 20 6e 2d 31 2c 20 73 68 65 6c 6c 5f 69  ta, n-1, shell_i
32240 6e 74 33 32 28 64 61 74 61 2c 20 32 2b 6e 29 20  nt32(data, 2+n) 
32250 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46  ".      "      F
32260 52 4f 4d 20 66 72 65 65 6c 69 73 74 20 57 48 45  ROM freelist WHE
32270 52 45 20 6e 3e 3d 30 22 0a 20 20 20 20 20 20 22  RE n>=0".      "
32280 29 22 0a 20 20 20 20 20 20 22 52 45 50 4c 41 43  )".      "REPLAC
32290 45 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e  E INTO recovery.
322a0 66 72 65 65 6c 69 73 74 20 53 45 4c 45 43 54 20  freelist SELECT 
322b0 66 72 65 65 70 67 6e 6f 20 46 52 4f 4d 20 66 72  freepgno FROM fr
322c0 65 65 6c 69 73 74 3b 22 0a 20 20 20 20 29 3b 0a  eelist;".    );.
322d0 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63    }..  shellExec
322e0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
322f0 2c 20 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  , .    "CREATE T
32300 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 64 62  ABLE recovery.db
32310 70 74 72 28 22 0a 20 20 20 20 22 20 20 20 20 20  ptr(".    "     
32320 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c 20 50 52   pgno, child, PR
32330 49 4d 41 52 59 20 4b 45 59 28 63 68 69 6c 64 2c  IMARY KEY(child,
32340 20 70 67 6e 6f 29 22 0a 20 20 20 20 22 29 20 57   pgno)".    ") W
32350 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20  ITHOUT ROWID;". 
32360 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
32370 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63 6f 76 65  NORE INTO recove
32380 72 79 2e 64 62 70 74 72 28 70 67 6e 6f 2c 20 63  ry.dbptr(pgno, c
32390 68 69 6c 64 29 20 22 0a 20 20 20 20 22 20 20 20  hild) ".    "   
323a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
323b0 71 6c 69 74 65 5f 64 62 70 74 72 22 0a 20 20 20  qlite_dbptr".   
323c0 20 22 20 20 20 20 20 20 57 48 45 52 45 20 70 67   "      WHERE pg
323d0 6e 6f 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69  no NOT IN freeli
323e0 73 74 20 41 4e 44 20 63 68 69 6c 64 20 4e 4f 54  st AND child NOT
323f0 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 0a   IN freelist;"..
32400 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e      /* Delete an
32410 79 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  y pointer to pag
32420 65 20 31 2e 20 54 68 69 73 20 65 6e 73 75 72 65  e 1. This ensure
32430 73 20 74 68 61 74 20 70 61 67 65 20 31 20 69 73  s that page 1 is
32440 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20   considered.    
32450 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67 65 2c 20  ** a root page, 
32460 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f  regardless of ho
32470 77 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 62  w corrupt the db
32480 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c   is. */.    "DEL
32490 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  ETE FROM recover
324a0 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68  y.dbptr WHERE ch
324b0 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f  ild = 1;"..    /
324c0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69  * Delete all poi
324d0 6e 74 65 72 73 20 74 6f 20 61 6e 79 20 70 61 67  nters to any pag
324e0 65 73 20 74 68 61 74 20 68 61 76 65 20 6d 6f 72  es that have mor
324f0 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74  e than one point
32500 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
32510 6d 2e 20 53 75 63 68 20 70 61 67 65 73 20 77 69  m. Such pages wi
32520 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
32530 20 72 6f 6f 74 20 70 61 67 65 73 20 77 68 65 6e   root pages when
32540 20 72 65 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   recovering.    
32550 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  ** data.  */.   
32560 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65   "DELETE FROM re
32570 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
32580 52 45 20 63 68 69 6c 64 20 49 4e 20 28 22 0a 20  RE child IN (". 
32590 20 20 20 22 20 20 53 45 4c 45 43 54 20 63 68 69     "  SELECT chi
325a0 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  ld FROM recovery
325b0 2e 64 62 70 74 72 20 47 52 4f 55 50 20 42 59 20  .dbptr GROUP BY 
325c0 63 68 69 6c 64 20 48 41 56 49 4e 47 20 63 6f 75  child HAVING cou
325d0 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b  nt(*)>1".    ");
325e0 22 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  "..    /* Create
325f0 20 74 68 65 20 22 6d 61 70 22 20 74 61 62 6c 65   the "map" table
32600 20 74 68 61 74 20 77 69 6c 6c 20 28 65 76 65 6e   that will (even
32610 74 75 61 6c 6c 79 29 20 63 6f 6e 74 61 69 6e 20  tually) contain 
32620 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
32630 20 2a 2a 20 66 6f 72 20 64 65 61 6c 69 6e 67 20   ** for dealing 
32640 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 69  with each page i
32650 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
32660 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
32670 72 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  re .    ** recor
32680 64 73 2e 20 2a 2f 0a 20 20 20 20 22 43 52 45 41  ds. */.    "CREA
32690 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72  TE TABLE recover
326a0 79 2e 6d 61 70 28 22 0a 20 20 20 20 20 20 22 70  y.map(".      "p
326b0 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gno INTEGER PRIM
326c0 41 52 59 20 4b 45 59 2c 20 6d 61 78 6c 65 6e 20  ARY KEY, maxlen 
326d0 49 4e 54 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f  INT, intkey, roo
326e0 74 20 49 4e 54 22 0a 20 20 20 20 22 29 3b 22 0a  t INT".    ");".
326f0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
32700 20 74 61 62 6c 65 20 5b 6d 61 70 5d 2e 20 49 66   table [map]. If
32710 20 74 68 65 72 65 20 61 72 65 20 63 69 72 63 75   there are circu
32720 6c 61 72 20 6c 6f 6f 70 73 20 6f 66 20 70 61 67  lar loops of pag
32730 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  es in the.    **
32740 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
32750 6f 6c 6c 6f 77 69 6e 67 20 61 64 64 73 20 61 6c  ollowing adds al
32760 6c 20 70 61 67 65 73 20 69 6e 20 73 75 63 68 20  l pages in such 
32770 61 20 6c 6f 6f 70 20 74 6f 20 74 68 65 20 6d 61  a loop to the ma
32780 70 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 69  p.    ** as indi
32790 76 69 64 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  vidual root page
327a0 73 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  s. This could be
327b0 20 68 61 6e 64 6c 65 64 20 62 65 74 74 65 72 2e   handled better.
327c0 20 20 2a 2f 0a 20 20 20 20 22 57 49 54 48 20 70    */.    "WITH p
327d0 61 67 65 73 28 69 2c 20 6d 61 78 6c 65 6e 29 20  ages(i, maxlen) 
327e0 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  AS (".    "  SEL
327f0 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74 2c 20  ECT page_count, 
32800 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  (".    "    SELE
32810 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20  CT max(field+1) 
32820 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61  FROM sqlite_dbda
32830 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 70 61  ta WHERE pgno=pa
32840 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22 20  ge_count".    " 
32850 20 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70   ) FROM pragma_p
32860 61 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22  age_count".    "
32870 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20      UNION ALL". 
32880 20 20 20 22 20 20 53 45 4c 45 43 54 20 69 2d 31     "  SELECT i-1
32890 2c 20 28 22 0a 20 20 20 20 22 20 20 20 20 53 45  , (".    "    SE
328a0 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31  LECT max(field+1
328b0 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  ) FROM sqlite_db
328c0 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d  data WHERE pgno=
328d0 69 2d 31 22 0a 20 20 20 20 22 20 20 29 20 46 52  i-1".    "  ) FR
328e0 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45 20 69  OM pages WHERE i
328f0 3e 3d 32 22 0a 20 20 20 20 22 29 22 0a 20 20 20  >=2".    ")".   
32900 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65   "INSERT INTO re
32910 63 6f 76 65 72 79 2e 6d 61 70 28 70 67 6e 6f 2c  covery.map(pgno,
32920 20 6d 61 78 6c 65 6e 2c 20 69 6e 74 6b 65 79 2c   maxlen, intkey,
32930 20 72 6f 6f 74 29 20 22 0a 20 20 20 20 22 20 20   root) ".    "  
32940 53 45 4c 45 43 54 20 69 2c 20 6d 61 78 6c 65 6e  SELECT i, maxlen
32950 2c 20 4e 55 4c 4c 2c 20 28 22 0a 20 20 20 20 22  , NULL, (".    "
32960 20 20 20 20 57 49 54 48 20 70 28 6f 72 69 67 2c      WITH p(orig,
32970 20 70 67 6e 6f 2c 20 70 61 72 65 6e 74 29 20 41   pgno, parent) A
32980 53 20 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  S (".    "      
32990 53 45 4c 45 43 54 20 30 2c 20 69 2c 20 28 53 45  SELECT 0, i, (SE
329a0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
329b0 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48  ecovery.dbptr WH
329c0 45 52 45 20 63 68 69 6c 64 3d 69 29 22 0a 20 20  ERE child=i)".  
329d0 20 20 22 20 20 20 20 20 20 20 20 55 4e 49 4f 4e    "        UNION
329e0 20 41 4c 4c 22 0a 20 20 20 20 22 20 20 20 20 20   ALL".    "     
329f0 20 53 45 4c 45 43 54 20 69 2c 20 70 2e 70 61 72   SELECT i, p.par
32a00 65 6e 74 2c 20 22 0a 20 20 20 20 22 20 20 20 20  ent, ".    "    
32a10 20 20 20 20 28 53 45 4c 45 43 54 20 70 67 6e 6f      (SELECT pgno
32a20 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
32a30 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
32a40 3d 70 2e 70 61 72 65 6e 74 29 20 46 52 4f 4d 20  =p.parent) FROM 
32a50 70 22 0a 20 20 20 20 22 20 20 20 20 29 22 0a 20  p".    "    )". 
32a60 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 70     "    SELECT p
32a70 67 6e 6f 20 46 52 4f 4d 20 70 20 57 48 45 52 45  gno FROM p WHERE
32a80 20 28 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c   (parent IS NULL
32a90 20 4f 52 20 70 67 6e 6f 20 3d 20 6f 72 69 67 29   OR pgno = orig)
32aa0 22 0a 20 20 20 20 22 29 20 22 0a 20 20 20 20 22  ".    ") ".    "
32ab0 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45  FROM pages WHERE
32ac0 20 6d 61 78 6c 65 6e 20 3e 20 30 20 41 4e 44 20   maxlen > 0 AND 
32ad0 69 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69 73  i NOT IN freelis
32ae0 74 3b 22 0a 20 20 20 20 22 55 50 44 41 54 45 20  t;".    "UPDATE 
32af0 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 41 53 20  recovery.map AS 
32b00 6f 20 53 45 54 20 69 6e 74 6b 65 79 20 3d 20 28  o SET intkey = (
32b10 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
32b20 73 75 62 73 74 72 28 64 61 74 61 2c 20 31 2c 20  substr(data, 1, 
32b30 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73  1)==X'0D' FROM s
32b40 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45  qlite_dbpage WHE
32b50 52 45 20 70 67 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a  RE pgno=o.pgno".
32b60 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a      ");"..    /*
32b70 20 45 78 74 72 61 63 74 20 64 61 74 61 20 66 72   Extract data fr
32b80 6f 6d 20 70 61 67 65 20 31 20 61 6e 64 20 61 6e  om page 1 and an
32b90 79 20 6c 69 6e 6b 65 64 20 70 61 67 65 73 20 69  y linked pages i
32ba0 6e 74 6f 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  nto table.    **
32bb0 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
32bc0 2e 20 57 69 74 68 20 74 68 65 20 73 61 6d 65 20  . With the same 
32bd0 73 63 68 65 6d 61 20 61 73 20 61 6e 20 73 71 6c  schema as an sql
32be0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
32bf0 2e 20 20 2a 2f 0a 20 20 20 20 22 43 52 45 41 54  .  */.    "CREAT
32c00 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
32c10 2e 73 63 68 65 6d 61 28 74 79 70 65 2c 20 6e 61  .schema(type, na
32c20 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f  me, tbl_name, ro
32c30 6f 74 70 61 67 65 2c 20 73 71 6c 29 3b 22 0a 20  otpage, sql);". 
32c40 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
32c50 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
32c60 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
32c70 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69  max(CASE WHEN fi
32c80 65 6c 64 3d 30 20 54 48 45 4e 20 76 61 6c 75 65  eld=0 THEN value
32c90 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c   ELSE NULL END),
32ca0 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53  ".    "  max(CAS
32cb0 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 31 20 54  E WHEN field=1 T
32cc0 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e  HEN value ELSE N
32cd0 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22  ULL END),".    "
32ce0 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20    max(CASE WHEN 
32cf0 66 69 65 6c 64 3d 32 20 54 48 45 4e 20 76 61 6c  field=2 THEN val
32d00 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44  ue ELSE NULL END
32d10 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  ),".    "  max(C
32d20 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 33  ASE WHEN field=3
32d30 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
32d40 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20   NULL END),".   
32d50 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
32d60 4e 20 66 69 65 6c 64 3d 34 20 54 48 45 4e 20 76  N field=4 THEN v
32d70 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
32d80 4e 44 29 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  ND)".    "FROM s
32d90 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45  qlite_dbdata WHE
32da0 52 45 20 70 67 6e 6f 20 49 4e 20 28 22 0a 20 20  RE pgno IN (".  
32db0 20 20 22 20 20 53 45 4c 45 43 54 20 70 67 6e 6f    "  SELECT pgno
32dc0 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d   FROM recovery.m
32dd0 61 70 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 22  ap WHERE root=1"
32de0 0a 20 20 20 20 22 29 22 0a 20 20 20 20 22 47 52  .    ")".    "GR
32df0 4f 55 50 20 42 59 20 70 67 6e 6f 2c 20 63 65 6c  OUP BY pgno, cel
32e00 6c 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  l;".    "CREATE 
32e10 49 4e 44 45 58 20 72 65 63 6f 76 65 72 79 2e 73  INDEX recovery.s
32e20 63 68 65 6d 61 5f 72 6f 6f 74 70 61 67 65 20 4f  chema_rootpage O
32e30 4e 20 73 63 68 65 6d 61 28 72 6f 6f 74 70 61 67  N schema(rootpag
32e40 65 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  e);".  );..  /* 
32e50 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
32e60 6f 6e 2c 20 74 68 65 6e 20 70 72 69 6e 74 20 6f  on, then print o
32e70 75 74 20 61 6c 6c 20 6e 6f 6e 2d 76 69 72 74 75  ut all non-virtu
32e80 61 6c 2c 20 6e 6f 6e 2d 22 73 71 6c 69 74 65 5f  al, non-"sqlite_
32e90 25 22 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  %" .  ** CREATE 
32ea0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
32eb0 20 74 68 61 74 20 65 78 74 72 61 63 74 65 64 20   that extracted 
32ec0 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e  from the existin
32ed0 67 20 73 63 68 65 6d 61 2e 20 20 2a 2f 0a 20 20  g schema.  */.  
32ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32ef0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
32f00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
32f10 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
32f20 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 42  (pState->out, "B
32f30 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 72  EGIN;\n");.    r
32f40 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
32f50 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
32f60 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
32f70 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 73 68   on;\n");.    sh
32f80 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
32f90 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20  e->db, &rc,.    
32fa0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
32fb0 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63  FROM recovery.sc
32fc0 68 65 6d 61 20 22 0a 20 20 20 20 20 20 20 20 22  hema ".        "
32fd0 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
32fe0 65 27 20 41 4e 44 20 73 71 6c 20 4c 49 4b 45 20  e' AND sql LIKE 
32ff0 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27 22  'create table%'"
33000 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a  , &pStmt.    );.
33010 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
33020 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
33030 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
33040 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
33050 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
33060 2a 7a 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  *zCreateTable = 
33070 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
33080 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
33090 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
330a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
330b0 61 74 65 2d 3e 6f 75 74 2c 20 22 43 52 45 41 54  ate->out, "CREAT
330c0 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
330d0 58 49 53 54 53 20 25 73 3b 5c 6e 22 2c 20 0a 20  XISTS %s;\n", . 
330e0 20 20 20 20 20 20 20 20 20 26 7a 43 72 65 61 74           &zCreat
330f0 65 54 61 62 6c 65 5b 31 32 5d 0a 20 20 20 20 20  eTable[12].     
33100 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68   );.    }.    sh
33110 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
33120 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20   pStmt);.  }..  
33130 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
33140 20 61 6e 20 6f 72 70 68 61 6e 20 74 61 62 6c 65   an orphan table
33150 20 77 69 6c 6c 20 62 65 20 72 65 71 75 69 72 65   will be require
33160 64 2e 20 41 6e 64 20 69 66 20 73 6f 2c 20 68 6f  d. And if so, ho
33170 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 73 65 72  w many.  ** user
33180 20 63 6f 6c 75 6d 6e 73 20 69 74 20 73 68 6f 75   columns it shou
33190 6c 64 20 63 6f 6e 74 61 69 6e 20 2a 2f 0a 20 20  ld contain */.  
331a0 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74  shellPrepare(pSt
331b0 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20  ate->db, &rc, . 
331c0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 61       "SELECT coa
331d0 6c 65 73 63 65 28 6d 61 78 28 6d 61 78 6c 65 6e  lesce(max(maxlen
331e0 29 2c 20 2d 32 29 20 46 52 4f 4d 20 72 65 63 6f  ), -2) FROM reco
331f0 76 65 72 79 2e 6d 61 70 22 20 0a 20 20 20 20 20  very.map" .     
33200 20 22 20 20 57 48 45 52 45 20 72 6f 6f 74 3e 31   "  WHERE root>1
33210 20 41 4e 44 20 72 6f 6f 74 20 4e 4f 54 20 49 4e   AND root NOT IN
33220 20 28 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67   (SELECT rootpag
33230 65 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  e FROM recovery.
33240 73 63 68 65 6d 61 29 22 0a 20 20 20 20 20 20 2c  schema)".      ,
33250 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20 69   &pLoop.  );.  i
33260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33270 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
33280 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f  sqlite3_step(pLo
33290 6f 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72 70 68  op) ){.    nOrph
332a0 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  an = sqlite3_col
332b0 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30  umn_int(pLoop, 0
332c0 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69  );.  }.  shellFi
332d0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f  nalize(&rc, pLoo
332e0 70 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 30 3b  p);.  pLoop = 0;
332f0 0a 20 20 70 4f 72 70 68 61 6e 20 3d 20 72 65 63  .  pOrphan = rec
33300 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28  overOrphanTable(
33310 70 53 74 61 74 65 2c 20 26 72 63 2c 20 7a 4c 6f  pState, &rc, zLo
33320 73 74 41 6e 64 46 6f 75 6e 64 2c 20 6e 4f 72 70  stAndFound, nOrp
33330 68 61 6e 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72  han);..  shellPr
33340 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
33350 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45  , &rc,.      "SE
33360 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
33370 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52  ecovery.map WHER
33380 45 20 72 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67  E root=?", &pPag
33390 65 73 0a 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50  es.  );.  shellP
333a0 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64  repare(pState->d
333b0 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53  b, &rc,.      "S
333c0 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64 29  ELECT max(field)
333d0 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73  , group_concat(s
333e0 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
333f0 28 71 75 6f 74 65 28 76 61 6c 75 65 29 29 2c 20  (quote(value)), 
33400 27 2c 20 27 29 22 0a 20 20 20 20 20 20 22 46 52  ', ')".      "FR
33410 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61  OM sqlite_dbdata
33420 20 57 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20   WHERE pgno = ? 
33430 41 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a  AND field != ?".
33440 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
33450 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20  cell", &pCells. 
33460 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
33470 68 72 6f 75 67 68 20 65 61 63 68 20 72 6f 6f 74  hrough each root
33480 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c   page. */.  shel
33490 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
334a0 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20  >db, &rc, .     
334b0 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69   "SELECT root, i
334c0 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65  ntkey, max(maxle
334d0 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  n) FROM recovery
334e0 2e 6d 61 70 22 20 0a 20 20 20 20 20 20 22 20 57  .map" .      " W
334f0 48 45 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55  HERE root>1 GROU
33500 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65  P BY root, intke
33510 79 20 4f 52 44 45 52 20 42 59 20 72 6f 6f 74 3d  y ORDER BY root=
33520 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45  (".      "  SELE
33530 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
33540 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
33550 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c   WHERE name='sql
33560 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
33570 20 20 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70       ")", &pLoop
33580 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  .  );.  while( r
33590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
335a0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
335b0 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20  te3_step(pLoop) 
335c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f 74  ){.    int iRoot
335d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
335e0 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b  n_int(pLoop, 0);
335f0 0a 20 20 20 20 69 6e 74 20 62 49 6e 74 6b 65 79  .    int bIntkey
33600 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
33610 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b  n_int(pLoop, 1);
33620 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
33630 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
33640 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20  nt(pLoop, 2);.  
33650 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b    int bNoop = 0;
33660 0a 20 20 20 20 52 65 63 6f 76 65 72 54 61 62 6c  .    RecoverTabl
33670 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 70 54  e *pTab;..    pT
33680 61 62 20 3d 20 72 65 63 6f 76 65 72 46 69 6e 64  ab = recoverFind
33690 54 61 62 6c 65 28 70 53 74 61 74 65 2c 20 26 72  Table(pState, &r
336a0 63 2c 20 69 52 6f 6f 74 2c 20 62 49 6e 74 6b 65  c, iRoot, bIntke
336b0 79 2c 20 6e 43 6f 6c 2c 20 26 62 4e 6f 6f 70 29  y, nCol, &bNoop)
336c0 3b 0a 20 20 20 20 69 66 28 20 62 4e 6f 6f 70 20  ;.    if( bNoop 
336d0 7c 7c 20 72 63 20 29 20 63 6f 6e 74 69 6e 75 65  || rc ) continue
336e0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
336f0 30 20 29 20 70 54 61 62 20 3d 20 70 4f 72 70 68  0 ) pTab = pOrph
33700 61 6e 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  an;..    if( 0==
33710 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
33720 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 22  pTab->zQuoted, "
33730 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
33740 27 22 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '") ){.      raw
33750 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
33760 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  out, "DELETE FRO
33770 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
33780 65 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  e;\n");.    }.  
33790 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
337a0 6e 74 28 70 50 61 67 65 73 2c 20 31 2c 20 69 52  nt(pPages, 1, iR
337b0 6f 6f 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oot);.    sqlite
337c0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
337d0 73 2c 20 32 2c 20 70 54 61 62 2d 3e 69 50 6b 29  s, 2, pTab->iPk)
337e0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
337f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
33800 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
33810 65 33 5f 73 74 65 70 28 70 50 61 67 65 73 29 20  e3_step(pPages) 
33820 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  ){.      int iPg
33830 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
33840 75 6d 6e 5f 69 6e 74 28 70 50 61 67 65 73 2c 20  umn_int(pPages, 
33850 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
33860 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
33870 73 2c 20 31 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  s, 1, iPgno);.  
33880 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
33890 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
338a0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
338b0 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a  step(pCells) ){.
338c0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65          int nFie
338d0 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ld = sqlite3_col
338e0 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  umn_int(pCells, 
338f0 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  0);.        cons
33900 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28  t char *zVal = (
33910 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
33920 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
33930 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20 20 20  pCells, 1);..   
33940 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 6e 46       nField = nF
33950 69 65 6c 64 2b 31 3b 0a 20 20 20 20 20 20 20 20  ield+1;.        
33960 69 66 28 20 70 54 61 62 3d 3d 70 4f 72 70 68 61  if( pTab==pOrpha
33970 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
33980 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
33990 2d 3e 6f 75 74 2c 20 0a 20 20 20 20 20 20 20 20  ->out, .        
339a0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
339b0 54 4f 20 25 73 20 56 41 4c 55 45 53 28 25 64 2c  TO %s VALUES(%d,
339c0 20 25 64 2c 20 25 64 2c 20 25 73 25 73 25 73 29   %d, %d, %s%s%s)
339d0 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;\n",.          
339e0 20 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65      pTab->zQuote
339f0 64 2c 20 69 52 6f 6f 74 2c 20 69 50 67 6e 6f 2c  d, iRoot, iPgno,
33a00 20 6e 46 69 65 6c 64 2c 20 0a 20 20 20 20 20 20   nField, .      
33a10 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79 20          bIntkey 
33a20 3f 20 22 22 20 3a 20 22 4e 55 4c 4c 2c 20 22 2c  ? "" : "NULL, ",
33a30 20 7a 56 61 6c 2c 20 70 54 61 62 2d 3e 61 7a 6c   zVal, pTab->azl
33a40 43 6f 6c 5b 6e 46 69 65 6c 64 5d 0a 20 20 20 20  Col[nField].    
33a50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
33a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33a70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
33a80 61 74 65 2d 3e 6f 75 74 2c 20 22 49 4e 53 45 52  ate->out, "INSER
33a90 54 20 49 4e 54 4f 20 25 73 28 25 73 29 20 56 41  T INTO %s(%s) VA
33aa0 4c 55 45 53 28 20 25 73 20 29 3b 5c 6e 22 2c 20  LUES( %s );\n", 
33ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
33ac0 54 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 70 54  Tab->zQuoted, pT
33ad0 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c  ab->azlCol[nFiel
33ae0 64 5d 2c 20 7a 56 61 6c 0a 20 20 20 20 20 20 20  d], zVal.       
33af0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
33b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
33b10 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 43  ellReset(&rc, pC
33b20 65 6c 6c 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ells);.    }.   
33b30 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c   shellReset(&rc,
33b40 20 70 50 61 67 65 73 29 3b 0a 20 20 20 20 69 66   pPages);.    if
33b50 28 20 70 54 61 62 21 3d 70 4f 72 70 68 61 6e 20  ( pTab!=pOrphan 
33b60 29 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62  ) recoverFreeTab
33b70 6c 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  le(pTab);.  }.  
33b80 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
33b90 63 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 73 68 65  c, pLoop);.  she
33ba0 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
33bb0 70 50 61 67 65 73 29 3b 0a 20 20 73 68 65 6c 6c  pPages);.  shell
33bc0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 43  Finalize(&rc, pC
33bd0 65 6c 6c 73 29 3b 0a 20 20 72 65 63 6f 76 65 72  ells);.  recover
33be0 46 72 65 65 54 61 62 6c 65 28 70 4f 72 70 68 61  FreeTable(pOrpha
33bf0 6e 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  n);..  /* The re
33c00 73 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  st of the schema
33c10 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
33c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
33c30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
33c40 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c  mt = 0;.    shel
33c50 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
33c60 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20  >db, &rc, .     
33c70 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 2c 20     "SELECT sql, 
33c80 6e 61 6d 65 20 46 52 4f 4d 20 72 65 63 6f 76 65  name FROM recove
33c90 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20  ry.schema ".    
33ca0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
33cb0 4f 54 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20  OT LIKE 'create 
33cc0 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74  table%'", &pStmt
33cd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
33ce0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
33cf0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
33d00 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
33d10 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  mt) ){.      con
33d20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
33d30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
33d40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
33d50 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
33d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
33d70 72 6e 69 63 6d 70 28 7a 53 71 6c 2c 20 22 63 72  rnicmp(zSql, "cr
33d80 65 61 74 65 20 76 69 72 74 22 2c 20 31 31 29 3d  eate virt", 11)=
33d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
33da0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
33db0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
33dc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
33dd0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
33de0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 69        char *zPri
33df0 6e 74 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  nt = shellMPrint
33e00 66 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  f(&rc, .        
33e10 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
33e20 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
33e30 55 45 53 28 27 74 61 62 6c 65 27 2c 20 25 51 2c  UES('table', %Q,
33e40 20 25 51 2c 20 30 2c 20 25 51 29 22 2c 0a 20 20   %Q, 0, %Q)",.  
33e50 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
33e60 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20 20 20 20 20  Name, zSql.     
33e70 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 61     );.        ra
33e80 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
33e90 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  >out, "%s;\n", z
33ea0 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  Print);.        
33eb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
33ec0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  int);.      }els
33ed0 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
33ee0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
33ef0 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c  t, "%s;\n", zSql
33f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33f10 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
33f20 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
33f30 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
33f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33f50 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
33f60 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  e->out, "PRAGMA 
33f70 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
33f80 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a 20 20 20 20  = off;\n");.    
33f90 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
33fa0 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54 3b  e->out, "COMMIT;
33fb0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  \n");.  }.  sqli
33fc0 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d  te3_exec(pState-
33fd0 3e 64 62 2c 20 22 44 45 54 41 43 48 20 72 65 63  >db, "DETACH rec
33fe0 6f 76 65 72 79 22 2c 20 30 2c 20 30 2c 20 30 29  overy", 0, 0, 0)
33ff0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34000 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  .../*.** If an i
34010 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
34020 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
34030 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
34040 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
34050 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
34060 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
34070 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
34080 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
34090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
340a0 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63  o_meta_command(c
340b0 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c  har *zLine, Shel
340c0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
340d0 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e  t h = 1;.  int n
340e0 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Arg = 0;.  int n
340f0 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  , c;.  int rc = 
34100 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67  0;.  char *azArg
34110 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53  [50];..#ifndef S
34120 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
34130 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d  ALTABLE.  if( p-
34140 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
34150 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e  ){.    expertFin
34160 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20  ish(p, 1, 0);.  
34170 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50  }.#endif..  /* P
34180 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c  arse the input l
34190 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e  ine into tokens.
341a0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  .  */.  while( z
341b0 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c  Line[h] && nArg<
341c0 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29  ArraySize(azArg)
341d0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   ){.    while( I
341e0 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29  sSpace(zLine[h])
341f0 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ h++; }.    i
34200 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29  f( zLine[h]==0 )
34210 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
34220 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c  zLine[h]=='\'' |
34230 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20  | zLine[h]=='"' 
34240 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c  ){.      int del
34250 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b  im = zLine[h++];
34260 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
34270 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
34280 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
34290 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65  Line[h] && zLine
342a0 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20  [h]!=delim ){.  
342b0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
342c0 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69  h]=='\\' && deli
342d0 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b  m=='"' && zLine[
342e0 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20  h+1]!=0 ) h++;. 
342f0 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20         h++;.    
34300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c    }.      if( zL
34310 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b  ine[h]==delim ){
34320 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68  .        zLine[h
34330 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ++] = 0;.      }
34340 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d  .      if( delim
34350 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f  =='"' ) resolve_
34360 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
34370 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
34380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41  }else{.      azA
34390 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
343a0 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
343b0 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
343c0 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b   !IsSpace(zLine[
343d0 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20  h]) ){ h++; }.  
343e0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
343f0 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20   ) zLine[h++] = 
34400 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65  0;.      resolve
34410 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
34420 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
34430 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
34440 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c  cess the input l
34450 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
34460 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nArg==0 ) return
34470 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73   0; /* no tokens
34480 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
34490 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  n = strlen30(azA
344a0 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a  rg[0]);.  c = az
344b0 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65  Arg[0][0];.  cle
344c0 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a  arTempFile(p);..
344d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
344e0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
344f0 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  N.  if( c=='a' &
34500 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34510 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d  0], "auth", n)==
34520 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
34530 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
34540 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34550 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f   "Usage: .auth O
34560 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20  N|OFF\n");.     
34570 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
34580 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
34590 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
345a0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
345b0 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
345c0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
345d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
345e0 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
345f0 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c  ->db, shellAuth,
34600 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
34610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
34620 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
34630 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  db, 0, 0);.    }
34640 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
34650 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
34660 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
34670 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
34680 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
34690 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61  LIB).  if( c=='a
346a0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
346b0 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22  rg[0], "archive"
346c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
346d0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
346e0 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d    rc = arDotComm
346f0 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67 2c  and(p, 0, azArg,
34700 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
34710 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63  #endif..  if( (c
34720 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
34730 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34740 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d  ], "backup", n)=
34750 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73  =0).   || (c=='s
34760 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
34770 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
34780 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  save", n)==0).  
34790 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
347a0 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30  r *zDestFile = 0
347b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
347c0 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73   *zDb = 0;.    s
347d0 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
347e0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
347f0 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
34800 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 62  int j;.    int b
34810 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  Async = 0;.    c
34820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
34830 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  = 0;.    for(j=1
34840 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
34850 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34860 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
34870 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
34880 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '-' ){.        i
34890 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  f( z[1]=='-' ) z
348a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
348b0 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65  strcmp(z, "-appe
348c0 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
348d0 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61 70 6e       zVfs = "apn
348e0 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20 20 7d  dvfs";.        }
348f0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
34900 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 73 79   strcmp(z, "-asy
34910 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nc")==0 ){.     
34920 20 20 20 20 20 62 41 73 79 6e 63 20 3d 20 31 3b       bAsync = 1;
34930 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
34940 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
34950 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34960 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
34970 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61  option: %s\n", a
34980 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  zArg[j]);.      
34990 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
349a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
349b0 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c  lse if( zDestFil
349c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
349d0 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
349e0 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
349f0 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a  e if( zDb==0 ){.
34a00 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44          zDb = zD
34a10 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20  estFile;.       
34a20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
34a30 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
34a40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
34a50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34a60 55 73 61 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f  Usage: .backup ?
34a70 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49  DB? ?OPTIONS? FI
34a80 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
34a90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
34aa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34ab0 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
34ac0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
34ad0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69  intf(stderr, "mi
34ae0 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61  ssing FILENAME a
34af0 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b  rgument on .back
34b00 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  up\n");.      re
34b10 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
34b20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a    if( zDb==0 ) z
34b30 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
34b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
34b50 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
34b60 20 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20 20   &pDest, .      
34b70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
34b80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
34b90 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
34ba0 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20  EATE, zVfs);.   
34bb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
34bd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34be0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
34bf0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
34c00 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20  DestFile);.     
34c10 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29   close_db(pDest)
34c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
34c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34c40 62 41 73 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  bAsync ){.      
34c50 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 65  sqlite3_exec(pDe
34c60 73 74 2c 20 22 50 52 41 47 4d 41 20 73 79 6e 63  st, "PRAGMA sync
34c70 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20 50 52 41  hronous=OFF; PRA
34c80 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
34c90 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20 20 20 20  =OFF;",.        
34ca0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
34cb0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f   0);.    }.    o
34cc0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
34cd0 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
34ce0 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
34cf0 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
34d00 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ->db, zDb);.    
34d10 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
34d20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
34d30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
34d40 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
34d50 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
34d60 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64  );.      close_d
34d70 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  b(pDest);.      
34d80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
34d90 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
34da0 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
34db0 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
34dc0 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
34dd0 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
34de0 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
34df0 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
34e00 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
34e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
34e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34e30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
34e40 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
34e50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
34e60 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
34e70 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
34e80 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65      close_db(pDe
34e90 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
34ea0 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
34eb0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
34ec0 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20  Arg[0], "bail", 
34ed0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
34ee0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
34ef0 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20    bail_on_error 
34f00 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
34f10 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
34f20 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
34f30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
34f40 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f  sage: .bail on|o
34f50 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
34f60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
34f70 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
34f80 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
34f90 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
34fa0 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29  binary", n)==0 )
34fb0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
34fc0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  2 ){.      if( b
34fd0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
34fe0 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  g[1]) ){.       
34ff0 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70   setBinaryMode(p
35000 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
35010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35020 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f  setTextMode(p->o
35030 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ut, 1);.      }.
35040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35050 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35060 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e  rr, "Usage: .bin
35070 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ary on|off\n");.
35080 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35090 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
350a0 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72  f( c=='c' && str
350b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64  cmp(azArg[0],"cd
350c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
350d0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20   nArg==2 ){.#if 
350e0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
350f0 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
35100 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74 20  ).      wchar_t 
35110 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
35120 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
35130 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  de(azArg[1]);.  
35140 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75 72      rc = !SetCur
35150 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 7a  rentDirectoryW(z
35160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35170 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a  _free(z);.#else.
35180 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69 72        rc = chdir
35190 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64  (azArg[1]);.#end
351a0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
351b0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
351c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
351d0 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f  Cannot change to
351e0 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73 5c   directory \"%s\
351f0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
35200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
35210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
35220 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
35230 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
35240 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54 4f  age: .cd DIRECTO
35250 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RY\n");.      rc
35260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
35270 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e  lse..  /* The un
35280 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72 65  documented ".bre
35290 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64  akpoint" command
352a0 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20 74   causes a call t
352b0 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a  o the no-op.  **
352c0 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20 74   routine named t
352d0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
352e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d  ..  */.  if( c==
352f0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
35300 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
35310 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e   "breakpoint", n
35320 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74  )==0 ){.    test
35330 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
35340 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
35350 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='c' && n>=3 && 
35360 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
35370 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d  , "changes", n)=
35380 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
35390 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
353a0 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c  etOrClearFlag(p,
353b0 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e   SHFLG_CountChan
353c0 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  ges, azArg[1]);.
353d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
353e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
353f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 61  rr, "Usage: .cha
35400 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nges on|off\n");
35410 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
35420 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
35430 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75 74  /* Cancel output
35440 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69 66   redirection, if
35450 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
35460 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63 61   set (by .testca
35470 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65  se).  ** Then re
35480 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
35490 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d 6f  f the testcase-o
354a0 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 20  ut.txt file and 
354b0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 0a  compare against.
354c0 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20    ** azArg[1].  
354d0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
354e0 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72 74  ferences, report
354f0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65 78   an error and ex
35500 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  it..  */.  if( c
35510 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
35520 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
35530 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d  ], "check", n)==
35540 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
35550 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74  Res = 0;.    out
35560 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
35570 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
35580 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
35590 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
355a0 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41  : .check GLOB-PA
355b0 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  TTERN\n");.     
355c0 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
355d0 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20 72  se if( (zRes = r
355e0 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61 73  eadFile("testcas
355f0 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29 3d  e-out.txt", 0))=
35600 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
35610 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35620 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65  Error: cannot re
35630 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74  ad 'testcase-out
35640 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20  .txt'\n");.     
35650 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   rc = 2;.    }el
35660 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65 5f  se if( testcase_
35670 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52  glob(azArg[1],zR
35680 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  es)==0 ){.      
35690 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
356a0 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
356b0 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d 25       "testcase-%
356c0 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65 63  s FAILED\n Expec
356d0 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20  ted: [%s]\n     
356e0 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20   Got: [%s]\n",. 
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35700 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61 7a  p->zTestcase, az
35710 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20  Arg[1], zRes);. 
35720 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
35730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
35740 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
35750 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 6f  , "testcase-%s o
35760 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61  k\n", p->zTestca
35770 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  se);.      p->nC
35780 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  heck++;.    }.  
35790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
357a0 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Res);.  }else.. 
357b0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
357c0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
357d0 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20   "clone", n)==0 
357e0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
357f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54  =2 ){.      tryT
35800 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b  oClone(p, azArg[
35810 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
35820 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35830 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
35840 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45   .clone FILENAME
35850 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
35860 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
35870 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
35880 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  && n>1 && strncm
35890 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74  p(azArg[0], "dat
358a0 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29  abases", n)==0 )
358b0 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
358c0 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
358d0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
358e0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
358f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
35900 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
35910 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
35920 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
35930 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
35940 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
35950 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  List;.    sqlite
35960 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35970 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  f(data.colSepara
35980 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70  tor),data.colSep
35990 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20  arator,": ");.  
359a0 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a    data.cnt = 0;.
359b0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
359c0 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
359d0 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20  name, file FROM 
359e0 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f  pragma_database_
359f0 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20  list",.         
35a00 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
35a10 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
35a20 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
35a30 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
35a40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
35a50 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
35a60 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
35a70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
35a80 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
35a90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
35aa0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
35ab0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
35ac0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62  mp(azArg[0], "db
35ad0 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29  config", n)==0 )
35ae0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
35af0 73 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e 66  st struct DbConf
35b00 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20 20 20  igChoices {.    
35b10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
35b20 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ame;.      int o
35b30 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f 6e 66  p;.    } aDbConf
35b40 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ig[] = {.       
35b50 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22   { "enable_fkey"
35b60 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
35b70 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
35b80 45 59 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  EY            },
35b90 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
35ba0 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20 20 53  le_trigger",   S
35bb0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35bc0 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20 20  NABLE_TRIGGER   
35bd0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35be0 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a   { "fts3_tokeniz
35bf0 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  er",   SQLITE_DB
35c00 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54  CONFIG_ENABLE_FT
35c10 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c  S3_TOKENIZER  },
35c20 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f 61 64  .        { "load
35c30 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 53  _extension",   S
35c40 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35c50 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
35c60 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20 20 20  SION  },.       
35c70 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63   { "no_ckpt_on_c
35c80 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f 44 42  lose", SQLITE_DB
35c90 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f  CONFIG_NO_CKPT_O
35ca0 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 7d 2c  N_CLOSE       },
35cb0 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
35cc0 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20 20 53  le_qpsg",      S
35cd0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35ce0 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20 20 20  NABLE_QPSG      
35cf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35d00 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71 70 22   { "trigger_eqp"
35d10 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
35d20 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
35d30 51 50 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  QP            },
35d40 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65 73 65  .        { "rese
35d50 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20 20 53  t_database",   S
35d60 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52  QLITE_DBCONFIG_R
35d70 45 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20  ESET_DATABASE   
35d80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35d90 20 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20   { "defensive", 
35da0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
35db0 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
35dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
35dd0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
35de0 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f  ii, v;.    open_
35df0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f  db(p, 0);.    fo
35e00 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79  r(ii=0; ii<Array
35e10 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b  Size(aDbConfig);
35e20 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
35e30 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63  ( nArg>1 && strc
35e40 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62  mp(azArg[1], aDb
35e50 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
35e60 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
35e70 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
35e80 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
35e90 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
35ea0 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
35eb0 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e  [ii].op, boolean
35ec0 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c  Value(azArg[2]),
35ed0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
35ee0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
35ef0 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43  nfig(p->db, aDbC
35f00 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31  onfig[ii].op, -1
35f10 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66  , &v);.      utf
35f20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
35f30 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44   "%18s %s\n", aD
35f40 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
35f50 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  e, v ? "on" : "o
35f60 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff");.      if( 
35f70 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a  nArg>1 ) break;.
35f80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
35f90 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61  rg>1 && ii==Arra
35fa0 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
35fb0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35fc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35fd0 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62  rror: unknown db
35fe0 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22  config \"%s\"\n"
35ff0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
36000 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36010 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22  tderr, "Enter \"
36020 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68  .dbconfig\" with
36030 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
36040 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20  r a list\n");.  
36050 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a    }   .  }else..
36060 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
36070 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
36080 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
36090 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
360a0 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
360b0 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
360c0 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
360d0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72  lse..  if( c=='r
360e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
360f0 72 67 5b 30 5d 2c 20 22 72 65 63 6f 76 65 72 22  rg[0], "recover"
36100 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
36110 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
36120 20 20 72 63 20 3d 20 72 65 63 6f 76 65 72 44 61    rc = recoverDa
36130 74 61 62 61 73 65 43 6d 64 28 70 2c 20 6e 41 72  tabaseCmd(p, nAr
36140 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
36150 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
36160 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
36170 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
36180 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
36190 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
361a0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
361b0 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
361c0 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
361d0 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61  ader;.    int sa
361e0 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20  vedShellFlags = 
361f0 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20  p->shellFlgs;.  
36200 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
36210 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
36220 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65  veRowid|SHFLG_Ne
36230 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68  wlines|SHFLG_Ech
36240 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  o);.    for(i=1;
36250 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
36260 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
36270 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
36280 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36290 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
362a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
362b0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
362c0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
362d0 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
362e0 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
362f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36300 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
36310 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36320 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
36330 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
36340 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
36350 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
36360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36370 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
36380 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36390 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
363a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
363b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
363c0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
363d0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
363e0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
363f0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
36400 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
36410 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
36420 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
36430 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
36440 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
36450 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
36460 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
36470 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
36480 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
36490 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
364a0 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
364b0 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
364c0 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
364d0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
364e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
364f0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
36500 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
36510 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
36520 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
36530 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
36540 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
36550 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
36560 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
36570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36580 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
36590 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
365a0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
365b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
365c0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
365d0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
365e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
365f0 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
36600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36610 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
36620 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c  ..    /* When pl
36630 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75  aying back a "du
36640 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  mp", the content
36650 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
36660 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   an order.    **
36670 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d   which causes im
36680 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
36690 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
366a0 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a  to be violated..
366b0 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c      ** So disabl
366c0 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f  e foreign-key co
366d0 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65  nstraint enforce
366e0 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20  ment to prevent 
366f0 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20  problems. */.   
36700 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
36710 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  ut, "PRAGMA fore
36720 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22  ign_keys=OFF;\n"
36730 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
36740 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e  f(p->out, "BEGIN
36750 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22   TRANSACTION;\n"
36760 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62  );.    p->writab
36770 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  leSchema = 0;.  
36780 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
36790 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20  = 0;.    /* Set 
367a0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
367b0 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  ON since doing s
367c0 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20  o forces SQLite 
367d0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
367e0 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20    ** as much of 
367f0 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69 74  the schema as it
36800 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65   can even if the
36810 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
36820 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63  able is.    ** c
36830 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73  orrupt. */.    s
36840 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
36850 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75  b, "SAVEPOINT du
36860 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61  mp; PRAGMA writa
36870 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20  ble_schema=ON", 
36880 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0, 0, 0);.    p-
36890 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69  >nErr = 0;.    i
368a0 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20  f( zLike==0 ){. 
368b0 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
368c0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
368d0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
368e0 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
368f0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
36900 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
36910 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
36920 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
36930 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69   AND name!='sqli
36940 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
36950 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
36960 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
36970 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
36980 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
36990 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
369a0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
369b0 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d     "WHERE name==
369c0 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
369d0 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  '".      );.    
369e0 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
369f0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
36a00 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
36a10 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
36a20 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
36a30 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
36a40 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
36a50 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
36a60 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20  iew')", 0.      
36a70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36a80 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
36a90 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
36aa0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
36ab0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
36ac0 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
36ad0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
36ae0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
36af0 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  E tbl_name LIKE 
36b00 25 51 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  %Q AND type=='ta
36b10 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 22 20  ble'".        " 
36b20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c   AND sql NOT NUL
36b30 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20  L", zLike);.    
36b40 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
36b50 70 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b  p_query(p,zSql);
36b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
36b70 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
36b80 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
36b90 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
36ba0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
36bb0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
36bc0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
36bd0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20   sql NOT NULL". 
36be0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79         "  AND ty
36bf0 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
36c00 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
36c10 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
36c20 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25   tbl_name LIKE %
36c30 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20  Q", zLike);.    
36c40 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
36c50 5f 71 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20  _query(p, zSql, 
36c60 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
36c70 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
36c80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77    }.    if( p->w
36c90 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b  ritableSchema ){
36ca0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36cb0 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  f(p->out, "PRAGM
36cc0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
36cd0 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  a=OFF;\n");.    
36ce0 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
36cf0 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ema = 0;.    }. 
36d00 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
36d10 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
36d20 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
36d30 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
36d40 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
36d50 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
36d60 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30   dump;", 0, 0, 0
36d70 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
36d80 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72  f(p->out, p->nEr
36d90 72 3f 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20  r?"ROLLBACK; -- 
36da0 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22  due to errors\n"
36db0 3a 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20  :"COMMIT;\n");. 
36dc0 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
36dd0 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64   = savedShowHead
36de0 65 72 3b 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c  er;.    p->shell
36df0 46 6c 67 73 20 3d 20 73 61 76 65 64 53 68 65 6c  Flgs = savedShel
36e00 6c 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a  lFlags;.  }else.
36e10 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
36e20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36e30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30  ], "echo", n)==0
36e40 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
36e50 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==2 ){.      set
36e60 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  OrClearFlag(p, S
36e70 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67  HFLG_Echo, azArg
36e80 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
36e90 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36ea0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
36eb0 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e  : .echo on|off\n
36ec0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
36ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
36ee0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
36ef0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36f00 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20  ], "eqp", n)==0 
36f10 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
36f20 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  =2 ){.      p->a
36f30 75 74 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a  utoEQPtest = 0;.
36f40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74        if( p->aut
36f50 6f 45 51 50 74 72 61 63 65 20 29 7b 0a 20 20 20  oEQPtrace ){.   
36f60 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29       if( p->db )
36f70 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
36f80 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 76 64 62  >db, "PRAGMA vdb
36f90 65 5f 74 72 61 63 65 3d 4f 46 46 3b 22 2c 20 30  e_trace=OFF;", 0
36fa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
36fb0 20 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65   p->autoEQPtrace
36fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
36fd0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
36fe0 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d  zArg[1],"full")=
36ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
37000 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
37010 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d  QP_full;.      }
37020 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
37030 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65  azArg[1],"trigge
37040 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
37050 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
37060 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a  UTOEQP_trigger;.
37070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
37080 42 55 47 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  BUG.      }else 
37090 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
370a0 5b 31 5d 2c 22 74 65 73 74 22 29 3d 3d 30 20 29  [1],"test")==0 )
370b0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
370c0 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f  oEQP = AUTOEQP_o
370d0 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  n;.        p->au
370e0 74 6f 45 51 50 74 65 73 74 20 3d 20 31 3b 0a 20  toEQPtest = 1;. 
370f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
37100 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
37110 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
37120 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
37130 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b   = AUTOEQP_full;
37140 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
37150 45 51 50 74 72 61 63 65 20 3d 20 31 3b 0a 20 20  EQPtrace = 1;.  
37160 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c        open_db(p,
37170 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
37180 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
37190 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
371a0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
371b0 20 4c 49 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c   LIMIT 1", 0, 0,
371c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
371d0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
371e0 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72   "PRAGMA vdbe_tr
371f0 61 63 65 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20  ace=ON;", 0, 0, 
37200 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
37210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37220 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38  p->autoEQP = (u8
37230 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a  )booleanValue(az
37240 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
37250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37260 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37270 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71  err, "Usage: .eq
37280 70 20 6f 66 66 7c 6f 6e 7c 74 72 61 63 65 7c 74  p off|on|trace|t
37290 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b  rigger|full\n");
372a0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
372b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
372c0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
372d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
372e0 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
372f0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
37300 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
37310 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
37320 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
37330 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
37340 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
37350 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he ".explain" co
37360 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74  mmand is automat
37370 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c  ic now.  It is l
37380 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73  argely pointless
37390 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69  .  It.  ** retai
373a0 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62  ned purely for b
373b0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
373c0 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20  bility */.  if( 
373d0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
373e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
373f0 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
37400 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b      int val = 1;
37410 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
37420 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
37430 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
37440 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uto")==0 ){.    
37450 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20      val = 99;.  
37460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37470 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61     val =  boolea
37480 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
37490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
374a0 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26      if( val==1 &
374b0 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f  & p->mode!=MODE_
374c0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
374d0 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d   p->normalMode =
374e0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
374f0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
37500 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
37510 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
37520 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37530 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  val==0 ){.      
37540 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
37550 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d  E_Explain ) p->m
37560 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d  ode = p->normalM
37570 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ode;.      p->au
37580 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
37590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
375a0 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66  ==99 ){.      if
375b0 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
375c0 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
375d0 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
375e0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
375f0 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
37600 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
37610 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37620 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
37630 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
37640 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
37650 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29  expert", n)==0 )
37660 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
37670 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44   0);.    expertD
37680 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
37690 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
376a0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
376b0 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63   c=='f' && strnc
376c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75  mp(azArg[0], "fu
376d0 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30  llschema", n)==0
376e0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
376f0 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
37700 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
37710 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20      int doStats 
37720 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 0;.    memcpy(
37730 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
37740 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
37750 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
37760 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65  ;.    data.cMode
37770 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
37780 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
37790 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74  ( nArg==2 && opt
377a0 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31  ionMatch(azArg[1
377b0 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a  ], "indent") ){.
377c0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
377d0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
377e0 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20  ODE_Pretty;.    
377f0 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20    nArg = 1;.    
37800 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  }.    if( nArg!=
37810 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
37820 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
37830 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d  sage: .fullschem
37840 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29  a ?--indent?\n")
37850 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
37860 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
37870 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
37880 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
37890 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
378a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
378b0 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  db,.