/ Hex Artifact Content
Login

Artifact 2e9b6b05fd202499bbe233632f9e5a913d2afcd645b59a114bfeb440c3e5cd38:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 49 4e 43  te3expert.c..INC
62f0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6300: 2f 64 62 64 61 74 61 2e 63 0a 0a 23 69 66 20 64  /dbdata.c..#if d
6310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6320: 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a  ABLE_SESSION)./*
6330: 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d  .** State inform
6340: 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ation for a sing
6350: 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a  le open session.
6360: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
6370: 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70  t OpenSession Op
6380: 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63  enSession;.struc
6390: 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a  t OpenSession {.
63a0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
63c0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20  mbolic name for 
63d0: 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  this session */.
63e0: 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20    int nFilter;  
63f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6400: 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20  mber of xFilter 
6410: 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70  rejection GLOB p
6420: 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61  atterns */.  cha
6430: 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20  r **azFilter;   
6440: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
6450: 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74  f xFilter reject
6460: 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e  ion GLOB pattern
6470: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
6480: 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20  ession *p;      
6490: 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73  /* The open sess
64a0: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66  ion */.};.#endif
64b0: 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75  ../*.** Shell ou
64c0: 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d  tput mode inform
64d0: 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72  ation from befor
64e0: 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c  e ".explain on",
64f0: 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61  .** saved so tha
6500: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 74  t it can be rest
6510: 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69  ored by ".explai
6520: 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65  n off".*/.typede
6530: 66 20 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f  f struct SavedMo
6540: 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65  deInfo SavedMode
6550: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76  Info;.struct Sav
6560: 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69  edModeInfo {.  i
6570: 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20  nt valid;       
6580: 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c     /* Is there l
6590: 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72  egit data in her
65a0: 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  e? */.  int mode
65b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
65c0: 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65  ode prior to ".e
65d0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
65e0: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20  int showHeader; 
65f0: 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61      /* The ".hea
6600: 64 65 72 22 20 73 65 74 74 69 6e 67 20 70 72 69  der" setting pri
6610: 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20  or to ".explain 
6620: 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c  on" */.  int col
6630: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
6640: 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72  Column widths pr
6650: 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e  ior to ".explain
6660: 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65   on" */.};..type
6670: 64 65 66 20 73 74 72 75 63 74 20 45 78 70 65 72  def struct Exper
6680: 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e 66 6f  tInfo ExpertInfo
6690: 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72 74 49  ;.struct ExpertI
66a0: 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 65  nfo {.  sqlite3e
66b0: 78 70 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a  xpert *pExpert;.
66c0: 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a    int bVerbose;.
66d0: 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20  };../* A single 
66e0: 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51 50 20  line in the EQP 
66f0: 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65 64 65  output */.typede
6700: 66 20 73 74 72 75 63 74 20 45 51 50 47 72 61 70  f struct EQPGrap
6710: 68 52 6f 77 20 45 51 50 47 72 61 70 68 52 6f 77  hRow EQPGraphRow
6720: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6730: 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69 45 71  hRow {.  int iEq
6740: 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pId;           /
6750: 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20 72 6f  * ID for this ro
6760: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  w */.  int iPare
6770: 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  ntId;        /* 
6780: 49 44 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ID of the parent
6790: 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47 72 61   row */.  EQPGra
67a0: 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20 20 20  phRow *pNext;   
67b0: 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e 20 73  /* Next row in s
67c0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63 68 61  equence */.  cha
67d0: 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20 20 20  r zText[1];     
67e0: 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 64 69     /* Text to di
67f0: 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73 20 72  splay for this r
6800: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6c 6c  ow */.};../* All
6810: 20 45 51 50 20 6f 75 74 70 75 74 20 69 73 20 63   EQP output is c
6820: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 6e  ollected into an
6830: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6840: 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 74 79   following */.ty
6850: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6860: 47 72 61 70 68 20 45 51 50 47 72 61 70 68 3b 0a  Graph EQPGraph;.
6870: 73 74 72 75 63 74 20 45 51 50 47 72 61 70 68 20  struct EQPGraph 
6880: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
6890: 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c 69 6e  *pRow;    /* Lin
68a0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
68b0: 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51 50 20  rows of the EQP 
68c0: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51 50 47  output */.  EQPG
68d0: 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74 3b 20  raphRow *pLast; 
68e0: 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d 65 6e    /* Last elemen
68f0: 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20 6c 69  t of the pRow li
6900: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 50 72  st */.  char zPr
6910: 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20 2f 2a  efix[100];    /*
6920: 20 47 72 61 70 68 20 70 72 65 66 69 78 20 2a 2f   Graph prefix */
6930: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65  .};../*.** State
6940: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6950: 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ut the database 
6960: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f  connection is co
6970: 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a  ntained in an.**
6980: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6990: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
69a0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
69b0: 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61   struct ShellSta
69c0: 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73  te ShellState;.s
69d0: 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65  truct ShellState
69e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
6a00: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
6a10: 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b   u8 autoExplain;
6a20: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
6a30: 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e  atically turn on
6a40: 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a   .explain mode *
6a50: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 3b 20  /.  u8 autoEQP; 
6a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
6a70: 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
6a80: 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73 65  PLAN prior to se
6a90: 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a  ach SQL stmt */.
6aa0: 20 20 75 38 20 61 75 74 6f 45 51 50 74 65 73 74    u8 autoEQPtest
6ab0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75 74 6f  ;        /* auto
6ac0: 45 51 50 20 69 73 20 69 6e 20 74 65 73 74 20 6d  EQP is in test m
6ad0: 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f  ode */.  u8 auto
6ae0: 45 51 50 74 72 61 63 65 3b 20 20 20 20 20 20 20  EQPtrace;       
6af0: 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20 69 6e  /* autoEQP is in
6b00: 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f 0a 20   trace mode */. 
6b10: 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20 20 20   u8 statsOn;    
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6b30: 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72  to display memor
6b40: 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65  y stats before e
6b50: 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a  ach finalize */.
6b60: 20 20 75 38 20 73 63 61 6e 73 74 61 74 73 4f 6e    u8 scanstatsOn
6b70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
6b80: 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e   to display scan
6b90: 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61   stats before ea
6ba0: 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20  ch finalize */. 
6bb0: 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20   u8 openMode;   
6bc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c          /* SHELL
6bd0: 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41  _OPEN_NORMAL, _A
6be0: 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49  PPENDVFS, or _ZI
6bf0: 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f  PFILE */.  u8 do
6c00: 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  XdgOpen;        
6c10: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72    /* Invoke star
6c20: 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
6c30: 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28  in output_reset(
6c40: 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70 4c 65  ) */.  u8 nEqpLe
6c50: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  vel;          /*
6c60: 20 44 65 70 74 68 20 6f 66 20 74 68 65 20 45 51   Depth of the EQ
6c70: 50 20 6f 75 74 70 75 74 20 67 72 61 70 68 20 2a  P output graph *
6c80: 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54 79 70  /.  u8 eTraceTyp
6c90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48  e;         /* SH
6ca0: 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61 6c 75  ELL_TRACE_* valu
6cb0: 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20 74 72  e for type of tr
6cc0: 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ace */.  unsigne
6cd0: 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20 20 20  d mEqpLines;    
6ce0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72 69 74  /* Mask of verit
6cf0: 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20 74 68  ical lines in th
6d00: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6d10: 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43  ph */.  int outC
6d20: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
6d30: 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64 6f  * Revert to stdo
6d40: 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e 67  ut when reaching
6d50: 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63   zero */.  int c
6d60: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
6d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
6d80: 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64  ecords displayed
6d90: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74   so far */.  int
6da0: 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
6db0: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
6dc0: 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e 65 20  er of last line 
6dd0: 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a 2f 0a  read from in */.
6de0: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
6df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6e00: 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d 20 74   commands from t
6e10: 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20  his stream */.  
6e20: 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
6e30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
6e40: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6e50: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74    FILE *traceOut
6e60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  ;        /* Outp
6e70: 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74  ut for sqlite3_t
6e80: 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  race() */.  int 
6e90: 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  nErr;           
6ea0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6eb0: 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20  errors seen */. 
6ec0: 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20   int mode;      
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75          /* An ou
6ee0: 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e  tput mode settin
6ef0: 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 50  g */.  int modeP
6f00: 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rior;         /*
6f10: 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f 0a 20   Saved mode */. 
6f20: 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20   int cMode;     
6f30: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f          /* tempo
6f40: 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65  rary output mode
6f50: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
6f60: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
6f70: 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20  normalMode;     
6f80: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64     /* Output mod
6f90: 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61  e before ".expla
6fa0: 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  in on" */.  int 
6fb0: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
6fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
6fd0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
6fe0: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
6ff0: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
7000: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
7010: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
7020: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
7030: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  mn mode */.  int
7040: 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20   nCheck;        
7050: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7060: 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e   ".check" comman
7070: 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69  ds run */.  unsi
7080: 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73 3b 20  gned nProgress; 
7090: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
70a0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
70b0: 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  ks encountered *
70c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 78 50  /.  unsigned mxP
70d0: 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20 4d 61  rogress;   /* Ma
70e0: 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73 20 63  ximum progress c
70f0: 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72 65 20  allbacks before 
7100: 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75 6e 73  failing */.  uns
7110: 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72 65 73  igned flgProgres
7120: 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72  s;  /* Flags for
7130: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
7140: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  llback */.  unsi
7150: 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20  gned shellFlgs; 
7160: 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
7170: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
7180: 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20 20 20  _int64 szMax;   
7190: 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61 72 67  /* --maxsize arg
71a0: 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e 20 2a  ument to .open *
71b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
71c0: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
71d0: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
71e0: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
71f0: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
7200: 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b 20 20  ar *zTempFile;  
7210: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
7220: 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69 67 68  y file that migh
7230: 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e 67 20  t need deleting 
7240: 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74 63  */.  char zTestc
7250: 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20 4e  ase[30];    /* N
7260: 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ame of current t
7270: 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20 63 68  est case */.  ch
7280: 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  ar colSeparator[
7290: 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73  20]; /* Column s
72a0: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
72b0: 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c 20 6d  er for several m
72c0: 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 72  odes */.  char r
72d0: 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b  owSeparator[20];
72e0: 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61 74 6f   /* Row separato
72f0: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
7300: 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a 20 20  MODE_Ascii */.  
7310: 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69 6f 72  char colSepPrior
7320: 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20  [20];  /* Saved 
7330: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
7340: 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65   */.  char rowSe
7350: 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20  pPrior[20];  /* 
7360: 53 61 76 65 64 20 72 6f 77 20 73 65 70 61 72 61  Saved row separa
7370: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c  tor */.  int col
7380: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20  Width[100];     
7390: 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77 69 64  /* Requested wid
73a0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73b0: 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e  n when in column
73c0: 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63   mode*/.  int ac
73d0: 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20  tualWidth[100]; 
73e0: 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68   /* Actual width
73f0: 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
7400: 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c 56 61  */.  char nullVa
7410: 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54  lue[20];    /* T
7420: 68 65 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74  he text to print
7430: 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
7440: 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20  es back from.   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7470: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
7480: 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45  outfile[FILENAME
7490: 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61  _MAX]; /* Filena
74a0: 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20  me for *out */. 
74b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
74c0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
74d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
74e0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
74f0: 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73  har *zFreeOnClos
7500: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  e;         /* Fi
7510: 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77  lename to free w
7520: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
7530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
7540: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
7550: 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75  Name of VFS to u
7560: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7570: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
7580: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
7590: 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ent if any. */. 
75a0: 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20   FILE *pLog;    
75b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
75c0: 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65   log output here
75d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64   */.  int *aiInd
75e0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ent;         /* 
75f0: 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73  Array of indents
7600: 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78   used in MODE_Ex
7610: 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  plain */.  int n
7620: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
7630: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
7640: 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  ay aiIndent[] */
7650: 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20  .  int iIndent; 
7660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7670: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70  ex of current op
7680: 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   in aiIndent[] *
7690: 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73 47 72  /.  EQPGraph sGr
76a0: 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  aph;       /* In
76b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
76c0: 65 20 67 72 61 70 68 69 63 61 6c 20 45 58 50 4c  e graphical EXPL
76d0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 2a  AIN QUERY PLAN *
76e0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
76f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
7700: 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65 73 73  ION).  int nSess
7710: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
7720: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
7730: 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20 2a 2f  tive sessions */
7740: 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 61  .  OpenSession a
7750: 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20  Session[4];  /* 
7760: 41 72 72 61 79 20 6f 66 20 73 65 73 73 69 6f 6e  Array of session
7770: 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20 66 6f  s.  [0] is in fo
7780: 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  cus. */.#endif. 
7790: 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78 70 65   ExpertInfo expe
77a0: 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61  rt;        /* Va
77b0: 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75 73 20  lid if previous 
77c0: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e 65 78  command was ".ex
77d0: 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a  pert OPT..." */.
77e0: 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20  };.../* Allowed 
77f0: 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c  values for Shell
7800: 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a 2a 2f  State.autoEQP.*/
7810: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7820: 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20 20 20  _off      0     
7830: 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74        /* Automat
7840: 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ic EXPLAIN QUERY
7850: 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a 2f 0a   PLAN is off */.
7860: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
7870: 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20 20 20  on       1      
7880: 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69       /* Automati
7890: 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f 0a 23  c EQP is on */.#
78a0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 74  define AUTOEQP_t
78b0: 72 69 67 67 65 72 20 20 32 20 20 20 20 20 20 20  rigger  2       
78c0: 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20 61 6c      /* On and al
78d0: 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20 66 6f  so show plans fo
78e0: 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 23 64  r triggers */.#d
78f0: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 66 75  efine AUTOEQP_fu
7900: 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20 20 20  ll     3        
7910: 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c 6c 20     /* Show full 
7920: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 20 41  EXPLAIN */../* A
7930: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7940: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f 70 65  r ShellState.ope
7950: 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69 6e 65  nMode.*/.#define
7960: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
7970: 45 43 20 20 20 20 20 20 30 20 20 20 20 20 20 2f  EC      0      /
7980: 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65 20 73  * No open-mode s
7990: 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64 65 66  pecified */.#def
79a0: 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  ine SHELL_OPEN_N
79b0: 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20 20 20  ORMAL      1    
79c0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61 74 61    /* Normal data
79d0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 64 65  base file */.#de
79e0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79f0: 41 50 50 45 4e 44 56 46 53 20 20 20 32 20 20 20  APPENDVFS   2   
7a00: 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65 6e 64     /* Use append
7a10: 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  vfs */.#define S
7a20: 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
7a30: 45 20 20 20 20 20 33 20 20 20 20 20 20 2f 2a 20  E     3      /* 
7a40: 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20  Use the zipfile 
7a50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
7a60: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a70: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  PEN_READONLY    
7a80: 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  4      /* Open a
7a90: 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
7aa0: 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 23 64   read-only */.#d
7ab0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7ac0: 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35 20 20  _DESERIALIZE 5  
7ad0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73 69 6e      /* Open usin
7ae0: 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  g sqlite3_deseri
7af0: 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65 66 69  alize() */.#defi
7b00: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  ne SHELL_OPEN_HE
7b10: 58 44 42 20 20 20 20 20 20 20 36 20 20 20 20 20  XDB       6     
7b20: 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74 78 74   /* Use "dbtotxt
7b30: 22 20 6f 75 74 70 75 74 20 61 73 20 64 61 74 61  " output as data
7b40: 20 73 6f 75 72 63 65 20 2a 2f 0a 0a 2f 2a 20 41   source */../* A
7b50: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7b60: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 65 54 72  r ShellState.eTr
7b70: 61 63 65 54 79 70 65 0a 2a 2f 0a 23 64 65 66 69  aceType.*/.#defi
7b80: 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 50  ne SHELL_TRACE_P
7b90: 4c 41 49 4e 20 20 20 20 20 20 30 20 20 20 20 20  LAIN      0     
7ba0: 20 2f 2a 20 53 68 6f 77 20 69 6e 70 75 74 20 53   /* Show input S
7bb0: 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65 66 69  QL text */.#defi
7bc0: 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  ne SHELL_TRACE_E
7bd0: 58 50 41 4e 44 45 44 20 20 20 31 20 20 20 20 20  XPANDED   1     
7be0: 20 2f 2a 20 53 68 6f 77 20 65 78 70 61 6e 64 65   /* Show expande
7bf0: 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64  d SQL text */.#d
7c00: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43  efine SHELL_TRAC
7c10: 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 20 32 20 20  E_NORMALIZED 2  
7c20: 20 20 20 20 2f 2a 20 53 68 6f 77 20 6e 6f 72 6d      /* Show norm
7c30: 61 6c 69 7a 65 64 20 53 51 4c 20 74 65 78 74 20  alized SQL text 
7c40: 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20 69 6e 20 74  */../* Bits in t
7c50: 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 66 6c  he ShellState.fl
7c60: 67 50 72 6f 67 72 65 73 73 20 76 61 72 69 61 62  gProgress variab
7c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  le */.#define SH
7c80: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51 55 49  ELL_PROGRESS_QUI
7c90: 45 54 20 30 78 30 31 20 20 2f 2a 20 4f 6d 69 74  ET 0x01  /* Omit
7ca0: 20 61 6e 6e 6f 75 6e 63 69 6e 67 20 65 76 65 72   announcing ever
7cb0: 79 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  y progress callb
7cc0: 61 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ack */.#define S
7cd0: 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45  HELL_PROGRESS_RE
7ce0: 53 45 54 20 30 78 30 32 20 20 2f 2a 20 52 65 73  SET 0x02  /* Res
7cf0: 65 74 20 74 68 65 20 63 6f 75 6e 74 20 77 68 65  et the count whe
7d00: 6e 20 74 68 65 20 70 72 6f 67 72 65 73 0a 20 20  n the progres.  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6c 69 6d   ** callback lim
7d40: 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 61  it is reached, a
7d50: 6e 64 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  nd for each.    
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
7d80: 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 53 51 4c 20  * top-level SQL 
7d90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 23 64 65  statement */.#de
7da0: 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52  fine SHELL_PROGR
7db0: 45 53 53 5f 4f 4e 43 45 20 20 30 78 30 34 20 20  ESS_ONCE  0x04  
7dc0: 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20 2d 2d  /* Cancel the --
7dd0: 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69 72 69  limit after firi
7de0: 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ng once */../*.*
7df0: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7e00: 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67  allowed shellFlg
7e10: 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66  s values.*/.#def
7e20: 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61  ine SHFLG_Pageca
7e30: 63 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30  che      0x00000
7e40: 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67  001 /* The --pag
7e50: 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73  ecache option is
7e60: 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65   used */.#define
7e70: 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
7e80: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32        0x00000002
7e90: 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65   /* Lookaside me
7ea0: 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a  mory is used */.
7eb0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61  #define SHFLG_Ba
7ec0: 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30  ckslash      0x0
7ed0: 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d  0000004 /* The -
7ee0: 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f  -backslash optio
7ef0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7f00: 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65  fine SHFLG_Prese
7f10: 72 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30  rveRowid  0x0000
7f20: 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72  0008 /* .dump pr
7f30: 65 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61  eserves rowid va
7f40: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
7f50: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20  SHFLG_Newlines  
7f60: 20 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20       0x00000010 
7f70: 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69  /* .dump --newli
7f80: 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69  ne flag */.#defi
7f90: 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  ne SHFLG_CountCh
7fa0: 61 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30  anges   0x000000
7fb0: 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73  20 /* .changes s
7fc0: 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  etting */.#defin
7fd0: 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20  e SHFLG_Echo    
7fe0: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34         0x0000004
7ff0: 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d  0 /* .echo or --
8000: 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a  echo setting */.
8010: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 52 65  #define SHFLG_Re
8020: 63 6f 76 65 72 20 20 20 20 20 20 20 20 30 78 30  cover        0x0
8030: 30 30 30 30 30 38 30 20 2f 2a 20 2e 64 75 6d 70  0000080 /* .dump
8040: 20 69 73 20 2d 2d 72 65 63 6f 76 65 72 20 2a 2f   is --recover */
8050: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66  ../*.** Macros f
8060: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  or testing and s
8070: 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73  etting shellFlgs
8080: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  .*/.#define Shel
8090: 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20  lHasFlag(P,X)   
80a0: 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67   (((P)->shellFlg
80b0: 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65  s & (X))!=0).#de
80c0: 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61  fine ShellSetFla
80d0: 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e  g(P,X)    ((P)->
80e0: 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a  shellFlgs|=(X)).
80f0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65  #define ShellCle
8100: 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50  arFlag(P,X)  ((P
8110: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e  )->shellFlgs&=(~
8120: 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  (X)))../*.** The
8130: 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77  se are the allow
8140: 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  ed modes..*/.#de
8150: 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20  fine MODE_Line  
8160: 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c     0  /* One col
8170: 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42  umn per line.  B
8180: 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65  lank line betwee
8190: 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65  n records */.#de
81a0: 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  fine MODE_Column
81b0: 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63     1  /* One rec
81c0: 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20  ord per line in 
81d0: 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  neat columns */.
81e0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73  #define MODE_Lis
81f0: 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20  t     2  /* One 
8200: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
8210: 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72  with a separator
8220: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8230: 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20  _Semi     3  /* 
8240: 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73  Same as MODE_Lis
8250: 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22  t but append ";"
8260: 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   to each line */
8270: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74  .#define MODE_Ht
8280: 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e  ml     4  /* Gen
8290: 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74  erate an XHTML t
82a0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
82b0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20  MODE_Insert   5 
82c0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c   /* Generate SQL
82d0: 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d   "insert" statem
82e0: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
82f0: 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20  MODE_Quote    6 
8300: 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73   /* Quote values
8310: 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23   as for SQL */.#
8320: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20  define MODE_Tcl 
8330: 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72       7  /* Gener
8340: 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43  ate ANSI-C or TC
8350: 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74  L quoted element
8360: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
8370: 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a  E_Csv      8  /*
8380: 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20   Quote strings, 
8390: 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69  numbers are plai
83a0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  n */.#define MOD
83b0: 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a  E_Explain  9  /*
83c0: 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   Like MODE_Colum
83d0: 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72  n, but do not tr
83e0: 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23  uncate data */.#
83f0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69  define MODE_Asci
8400: 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41  i   10  /* Use A
8410: 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65  SCII unit and re
8420: 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73 20  cord separators 
8430: 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23  (0x1F/0x1E) */.#
8440: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74  define MODE_Pret
8450: 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74  ty  11  /* Prett
8460: 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20  y-print schemas 
8470: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8480: 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20 43  EQP     12  /* C
8490: 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e 20  onverts EXPLAIN 
84a0: 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75  QUERY PLAN outpu
84b0: 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20 2a  t into a graph *
84c0: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
84d0: 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b  char *modeDescr[
84e0: 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a  ] = {.  "line",.
84f0: 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c    "column",.  "l
8500: 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a  ist",.  "semi",.
8510: 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73    "html",.  "ins
8520: 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c  ert",.  "quote",
8530: 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76  .  "tcl",.  "csv
8540: 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a  ",.  "explain",.
8550: 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72    "ascii",.  "pr
8560: 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22 65  ettyprint",.  "e
8570: 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  qp".};../*.** Th
8580: 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75  ese are the colu
8590: 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61  mn/row/line sepa
85a0: 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74  rators used by t
85b0: 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d  he various.** im
85c0: 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65  port/export mode
85d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45  s..*/.#define SE
85e0: 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a  P_Column    "|".
85f0: 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20  #define SEP_Row 
8600: 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69        "\n".#defi
8610: 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20  ne SEP_Tab      
8620: 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45   "\t".#define SE
8630: 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a  P_Space     " ".
8640: 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d  #define SEP_Comm
8650: 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e  a     ",".#defin
8660: 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20  e SEP_CrLf      
8670: 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53  "\r\n".#define S
8680: 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78  EP_Unit      "\x
8690: 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  1F".#define SEP_
86a0: 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22  Record    "\x1E"
86b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62 61  ../*.** A callba
86c0: 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
86d0: 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66 61  e3_log() interfa
86e0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
86f0: 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69 64  id shellLog(void
8700: 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72   *pArg, int iErr
8710: 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Code, const char
8720: 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c 6c   *zMsg){.  Shell
8730: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
8740: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20  lState*)pArg;.  
8750: 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29  if( p->pLog==0 )
8760: 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38 5f   return;.  utf8_
8770: 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20  printf(p->pLog, 
8780: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
8790: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20  rCode, zMsg);.  
87a0: 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b  fflush(p->pLog);
87b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
87c0: 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70  nction:  shell_p
87d0: 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57  utsnl(X).**.** W
87e0: 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58 20  rite the text X 
87f0: 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28 6f  to the screen (o
8800: 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70 75  r whatever outpu
8810: 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65 63  t is being direc
8820: 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20 61  ted).** adding a
8830: 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65 20   newline at the 
8840: 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72 65  end, and then re
8850: 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  turn X..*/.stati
8860: 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74 73  c void shellPuts
8870: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8880: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20  context *pCtx,. 
8890: 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
88a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
88b0: 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  al.){.  ShellSta
88c0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
88d0: 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  ate*)sqlite3_use
88e0: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
88f0: 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75 74  (void)nVal;.  ut
8900: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
8910: 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
8920: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
8930: 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74  al[0]));.  sqlit
8940: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
8950: 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b  pCtx, apVal[0]);
8960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
8970: 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28 56  nction:   edit(V
8980: 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20 20  ALUE).**        
8990: 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56 41           edit(VA
89a0: 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a  LUE,EDITOR).**.*
89b0: 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a 2a  * These steps:.*
89c0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72 69  *.**     (1) Wri
89d0: 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61 20  te VALUE into a 
89e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
89f0: 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20 70  **     (2) Run p
8a00: 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f 6e  rogram EDITOR on
8a10: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
8a20: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29  file..**     (3)
8a30: 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f 72   Read the tempor
8a40: 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61 6e  ary file back an
8a50: 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f 6e  d return its con
8a60: 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73 75  tent as the resu
8a70: 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 44  lt..**     (4) D
8a80: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
8a90: 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49  ary file.**.** I
8aa0: 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72 67  f the EDITOR arg
8ab0: 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  ument is omitted
8ac0: 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  , use the value 
8ad0: 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a 2a  in the VISUAL.**
8ae0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
8af0: 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c 6c  iable.  If still
8b00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44 49   there is no EDI
8b10: 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e 20  TOR, through an 
8b20: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  error..**.** Als
8b30: 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  o throw an error
8b40: 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20 70   if the EDITOR p
8b50: 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20 61  rogram returns a
8b60: 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20 63   non-zero exit c
8b70: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ode..*/.#ifndef 
8b80: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
8b90: 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69 64  STEM.static void
8ba0: 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71 6c   editFunc(.  sql
8bb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8bc0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8bd0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8be0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
8bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69 74  onst char *zEdit
8c00: 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d  or;.  char *zTem
8c10: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8c20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
8c30: 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e   *zCmd = 0;.  in
8c40: 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72 63  t bBin;.  int rc
8c50: 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c 20  ;.  int hasCRNL 
8c60: 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  = 0;.  FILE *f =
8c70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
8c80: 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74 65  t64 sz;.  sqlite
8c90: 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e 73  3_int64 x;.  uns
8ca0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
8cb0: 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  0;..  if( argc==
8cc0: 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72  2 ){.    zEditor
8cd0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
8ce0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8cf0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
8d00: 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74 6f  else{.    zEdito
8d10: 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53 55  r = getenv("VISU
8d20: 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  AL");.  }.  if( 
8d30: 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20 20  zEditor==0 ){.  
8d40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8d50: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8d60: 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20 65  "no editor for e
8d70: 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20  dit()", -1);.   
8d80: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8d90: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
8da0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8db0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
8dc0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8dd0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8de0: 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20   "NULL input to 
8df0: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8e00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8e10: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8e20: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
8e30: 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d 70  ontext);.  zTemp
8e40: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
8e50: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
8e60: 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  (db, 0, SQLITE_F
8e70: 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
8e80: 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  E, &zTempFile);.
8e90: 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d    if( zTempFile=
8ea0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8eb0: 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b 0a  3_uint64 r = 0;.
8ec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
8ed0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
8ee0: 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d 70  , &r);.    zTemp
8ef0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
8f00: 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
8f10: 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  ", r);.    if( z
8f20: 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
8f30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8f40: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8f50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8f60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8f70: 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69 74  }.  bBin = sqlit
8f80: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
8f90: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42  gv[0])==SQLITE_B
8fa0: 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20 77  LOB;.  /* When w
8fb0: 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65 20  riting the file 
8fc0: 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64 6f  to be edited, do
8fd0: 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e 76   \n to \r\n conv
8fe0: 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74 65  ersions on syste
8ff0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61 6e  ms.  ** that wan
9000: 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64 69  t \r\n line endi
9010: 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f 70  ngs */.  f = fop
9020: 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62 42  en(zTempFile, bB
9030: 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22 29  in ? "wb" : "w")
9040: 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a  ;.  if( f==0 ){.
9050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9060: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9070: 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74  , "edit() cannot
9080: 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 22   open temp file"
9090: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
90a0: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
90b0: 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74 65   }.  sz = sqlite
90c0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
90d0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62 42  gv[0]);.  if( bB
90e0: 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66 77  in ){.    x = fw
90f0: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  rite(sqlite3_val
9100: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
9110: 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d  , 1, sz, f);.  }
9120: 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
9130: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
9140: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
9150: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9160: 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d  ]);.    /* Remem
9170: 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ber whether or n
9180: 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72 69  ot the value ori
9190: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
91a0: 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66  d \r\n */.    if
91b0: 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a 2c  ( z && strstr(z,
91c0: 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61 73  "\r\n")!=0 ) has
91d0: 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20  CRNL = 1;.    x 
91e0: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
91f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9200: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
9210: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
9220: 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  f = 0;.  if(
9230: 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71   x!=sz ){.    sq
9240: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9250: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69  or(context, "edi
9260: 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72  t() could not wr
9270: 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69  ite the whole fi
9280: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
9290: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
92a0: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73  ;.  }.  zCmd = s
92b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
92c0: 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69  %s \"%s\"", zEdi
92d0: 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b  tor, zTempFile);
92e0: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
92f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9300: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9310: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
9320: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
9330: 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  d;.  }.  rc = sy
9340: 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71  stem(zCmd);.  sq
9350: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
9360: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9370: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9380: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
9390: 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64  "EDITOR returned
93a0: 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b   non-zero", -1);
93b0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
93c0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66  unc_end;.  }.  f
93d0: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
93e0: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  le, "rb");.  if(
93f0: 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   f==0 ){.    sql
9400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9410: 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  r(context,.     
9420: 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20   "edit() cannot 
9430: 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  reopen temp file
9440: 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31   after edit", -1
9450: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
9460: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
9470: 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45   fseek(f, 0, SEE
9480: 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66  K_END);.  sz = f
9490: 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e  tell(f);.  rewin
94a0: 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  d(f);.  p = sqli
94b0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a  te3_malloc64( sz
94c0: 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20  +(bBin==0) );.  
94d0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
94e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
94f0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
9500: 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  xt);.    goto ed
9510: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
9520: 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20  .  x = fread(p, 
9530: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63 6c  1, sz, f);.  fcl
9540: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
9550: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
9560: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9570: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9580: 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "could not rea
9590: 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  d back the whole
95a0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
95b0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
95c0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  end;.  }.  if( b
95d0: 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Bin ){.    sqlit
95e0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34  e3_result_blob64
95f0: 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a 2c  (context, p, sz,
9600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
9610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9620: 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a 3b  ite3_int64 i, j;
9630: 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e 4c  .    if( hasCRNL
9640: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
9650: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
9660: 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e 20  tains \r\n then 
9670: 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  do no conversion
9680: 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a  s back to \n */.
9690: 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20 20        j = sz;.  
96a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
96b0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 69  * If the file di
96c0: 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79  d not originally
96d0: 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74 68   contain \r\n th
96e0: 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20 6e  en convert any n
96f0: 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c 6e  ew.      ** \r\n
9700: 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f   back into \n */
9710: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  .      for(i=j=0
9720: 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<sz; i++){.  
9730: 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d 3d        if( p[i]==
9740: 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d 3d  '\r' && p[i+1]==
9750: 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20  '\n' ) i++;.    
9760: 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69      p[j++] = p[i
9770: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
9780: 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70   sz = j;.      p
9790: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 20  [sz] = 0;.    } 
97a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
97b0: 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65  ult_text64(conte
97c0: 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  xt, (const char*
97d0: 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20  )p, sz,.        
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20    sqlite3_free, 
9800: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
9810: 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74  }.  p = 0;..edit
9820: 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28  _func_end:.  if(
9830: 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a   f ) fclose(f);.
9840: 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69    unlink(zTempFi
9850: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
9860: 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ree(zTempFile);.
9870: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9880: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9890: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
98a0: 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61  TEM */../*.** Sa
98b0: 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68  ve or restore th
98c0: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
98d0: 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20   mode.*/.static 
98e0: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
98f0: 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ush(ShellState *
9900: 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69  p){.  p->modePri
9910: 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  or = p->mode;.  
9920: 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70  memcpy(p->colSep
9930: 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  Prior, p->colSep
9940: 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70  arator, sizeof(p
9950: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29  ->colSeparator))
9960: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f  ;.  memcpy(p->ro
9970: 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f  wSepPrior, p->ro
9980: 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  wSeparator, size
9990: 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
99a0: 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  or));.}.static v
99b0: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f  oid outputModePo
99c0: 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  p(ShellState *p)
99d0: 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  {.  p->mode = p-
99e0: 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65  >modePrior;.  me
99f0: 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72  mcpy(p->colSepar
9a00: 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50  ator, p->colSepP
9a10: 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  rior, sizeof(p->
9a20: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  colSeparator));.
9a30: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53    memcpy(p->rowS
9a40: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77  eparator, p->row
9a50: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9a60: 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
9a70: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ));.}../*.** Out
9a80: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9a90: 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e  ring as a hex-en
9aa0: 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20  coded blob (eg. 
9ab0: 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61  X'1234' ).*/.sta
9ac0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
9ad0: 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f  hex_blob(FILE *o
9ae0: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
9af0: 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
9b00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9b10: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61  ar *zBlob = (cha
9b20: 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77  r *)pBlob;.  raw
9b30: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22  _printf(out,"X'"
9b40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9b50: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77  nBlob; i++){ raw
9b60: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32  _printf(out,"%02
9b70: 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66  x",zBlob[i]&0xff
9b80: 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  ); }.  raw_print
9b90: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
9ba0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69  *.** Find a stri
9bb0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  ng that is not f
9bc0: 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e  ound anywhere in
9bd0: 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20   z[].  Return a 
9be0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9bf0: 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  at string..**.**
9c00: 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61   Try to use zA a
9c10: 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66  nd zB first.  If
9c20: 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61   both of those a
9c30: 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64  re already found
9c40: 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20   in z[].** then 
9c50: 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72  make up some str
9c60: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ing and store it
9c70: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a   in the buffer z
9c80: 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  Buf..*/.static c
9c90: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65  onst char *unuse
9ca0: 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  d_string(.  cons
9cb0: 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74   Result must not
9ce0: 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65   appear anywhere
9cf0: 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74   in z */.  const
9d00: 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74   char *zA, const
9d10: 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20   char *zB,   /* 
9d20: 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20  Try these first 
9d30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  */.  char *zBuf 
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9d60: 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72  to store a gener
9d70: 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  ated string */.)
9d80: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d  {.  unsigned i =
9d90: 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72   0;.  if( strstr
9da0: 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74  (z, zA)==0 ) ret
9db0: 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74  urn zA;.  if( st
9dc0: 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29  rstr(z, zB)==0 )
9dd0: 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f   return zB;.  do
9de0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
9df0: 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22  printf(20,zBuf,"
9e00: 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b  (%s%u)", zA, i++
9e10: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72  );.  }while( str
9e20: 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29  str(z,zBuf)!=0 )
9e30: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
9e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9e50: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9e60: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
9e70: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
9e80: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
9e90: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ns..**.** See al
9ea0: 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  so: output_quote
9eb0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
9ec0: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
9ed0: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
9ee0: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
9ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
9f00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
9f10: 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79  r c;.  setBinary
9f20: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20  Mode(out, 1);.  
9f30: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9f40: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9f50: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
9f60: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  c==0 ){.    utf8
9f70: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  _printf(out,"'%s
9f80: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
9f90: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9fa0: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68  ut, "'");.    wh
9fb0: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
9fc0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9fd0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9fe0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
9ff0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
a000: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
a010: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
a020: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
a030: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
a040: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
a050: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a060: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
a070: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a080: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
a090: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a0a0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
a0b0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
a0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a0d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ++;.    }.    ra
a0e0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
a0f0: 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78  ");.  }.  setTex
a100: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
a110: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
a120: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a130: 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  as a quoted stri
a140: 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f  ng using SQL quo
a150: 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ting conventions
a160: 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ..** Additionall
a170: 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20  ly , escape the 
a180: 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68  "\n" and "\r" ch
a190: 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74  aracters so that
a1a0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20   they do not.** 
a1b0: 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79  get corrupted by
a1c0: 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61   end-of-line tra
a1d0: 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74  nslation facilit
a1e0: 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72  ies in some oper
a1f0: 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
a200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
a210: 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74  like output_quot
a220: 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20  ed_string() but 
a230: 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
a240: 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a  n of the \r\n.**
a250: 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73   escape mechanis
a260: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
a270: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
a280: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46  escaped_string(F
a290: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
a2a0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
a2b0: 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73  i;.  char c;.  s
a2c0: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74  etBinaryMode(out
a2d0: 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 1);.  for(i=0;
a2e0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a2f0: 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d  & c!='\'' && c!=
a300: 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b  '\n' && c!='\r';
a310: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d   i++){}.  if( c=
a320: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
a330: 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22  rintf(out,"'%s'"
a340: 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ,z);.  }else{.  
a350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a360: 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  L = 0;.    const
a370: 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a   char *zCR = 0;.
a380: 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b      int nNL = 0;
a390: 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
a3a0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31  ;.    char zBuf1
a3b0: 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b  [20], zBuf2[20];
a3c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
a3d0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
a3e0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
a3f0: 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nNL++;.      if
a400: 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e  ( z[i]=='\r' ) n
a410: 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CR++;.    }.    
a420: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a430: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a440: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a450: 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64      zNL = unused
a460: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22  _string(z, "\\n"
a470: 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31  , "\\012", zBuf1
a480: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a490: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
a4a0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
a4b0: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
a4c0: 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74   zCR = unused_st
a4d0: 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22  ring(z, "\\r", "
a4e0: 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a  \\015", zBuf2);.
a4f0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a500: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a510: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
a520: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a530: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
a540: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
a550: 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  \r' && c!='\''; 
a560: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
a570: 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a   c=='\'' ) i++;.
a580: 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20        if( i ){. 
a590: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a5a0: 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  tf(out, "%.*s", 
a5b0: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
a5c0: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
a5d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
a5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
a5f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
a600: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
a610: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
a620: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a640: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
a650: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
a660: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a670: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a680: 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20  ", zNL);.       
a690: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a6a0: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
a6b0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
a6c0: 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  CR);.    }.    r
a6d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a6e0: 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52  '");.    if( nCR
a6f0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a700: 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27  intf(out, ",'%s'
a710: 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52  ,char(13))", zCR
a720: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a730: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
a740: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a750: 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c  '%s',char(10))",
a760: 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   zNL);.    }.  }
a770: 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f  .  setTextMode(o
a780: 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut, 1);.}../*.**
a790: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a7a0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
a7b0: 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  oted according t
a7c0: 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69  o C or TCL quoti
a7d0: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ng rules..*/.sta
a7e0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a7f0: 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  c_string(FILE *o
a800: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
a810: 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  z){.  unsigned i
a820: 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22  nt c;.  fputc('"
a830: 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65  ', out);.  while
a840: 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d  ( (c = *(z++))!=
a850: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  0 ){.    if( c==
a860: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\\' ){.      fp
a870: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a880: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a890: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8a0: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
a8b0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a8c0: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22  ;.      fputc('"
a8d0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a8e0: 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29  se if( c=='\t' )
a8f0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a900: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a910: 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b  fputc('t', out);
a920: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a930: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
a940: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a950: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e  ;.      fputc('n
a960: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a970: 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29  se if( c=='\r' )
a980: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a990: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a9a0: 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b  fputc('r', out);
a9b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a9c0: 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20  isprint(c&0xff) 
a9d0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a9e0: 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f  ntf(out, "\\%03o
a9f0: 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20  ", c&0xff);.    
aa00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75  }else{.      fpu
aa10: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
aa20: 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22  }.  }.  fputc('"
aa30: 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ', out);.}../*.*
aa40: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
aa50: 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63  en string with c
aa60: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
aa70: 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a  re special to.**
aa80: 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a   HTML escaped..*
aa90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
aaa0: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
aab0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
aac0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
aad0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  t i;.  if( z==0 
aae0: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c  ) z = "";.  whil
aaf0: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72  e( *z ){.    for
ab00: 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20  (i=0;   z[i].   
ab10: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
ab20: 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20  !='<'.          
ab30: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20    && z[i]!='&'. 
ab40: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
ab50: 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20  i]!='>'.        
ab60: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22      && z[i]!='\"
ab70: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab80: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20   z[i]!='\'';.   
ab90: 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20       i++){}.    
aba0: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
abb0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
abc0: 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20  ,"%.*s",i,z);.  
abd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
abe0: 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72  =='<' ){.      r
abf0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
ac00: 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lt;");.    }else
ac10: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29   if( z[i]=='&' )
ac20: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
ac30: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
ac40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
ac50: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
ac60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac70: 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&gt;");.    }e
ac80: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
ac90: 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  "' ){.      raw_
aca0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f  printf(out,"&quo
acb0: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
acc0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
acd0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
ace0: 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b  tf(out,"&#39;");
acf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ad10: 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20     z += i + 1;. 
ad20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
ad30: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
ad40: 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64  any character id
ad50: 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20  entified by a 1 
ad60: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
ad70: 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20  .** array, then 
ad80: 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  the string must 
ad90: 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53  be quoted for CS
ada0: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  V..*/.static con
adb0: 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51  st char needCsvQ
adc0: 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20  uote[] = {.  1, 
add0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ade0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
adf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
ae00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae10: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
ae20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae30: 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c  1,.  1, 0, 1, 0,
ae40: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30   0, 0, 0, 1,   0
ae50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae60: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
ae70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae80: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
aea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aeb0: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
aed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aee0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
aef0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af00: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
af10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
af20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af30: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
af40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af50: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
af60: 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20  , 0, 0, 1,.  1, 
af70: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af80: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
afa0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afb0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
afc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afd0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
afe0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
aff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b000: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
b010: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b020: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b030: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
b040: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b050: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
b070: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b080: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
b090: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0a0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
b0b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
b0c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0d0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
b0e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0f0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b100: 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f  , 1, 1, 1,.};../
b110: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69  *.** Output a si
b120: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56  ngle term of CSV
b130: 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e  .  Actually, p->
b140: 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20  colSeparator is 
b150: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  used for.** the 
b160: 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68  separator, which
b170: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
b180: 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e  be a comma.  p->
b190: 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20  nullValue is.** 
b1a0: 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20  the null value. 
b1b0: 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f   Strings are quo
b1c0: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
b1d0: 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72  .  The separator
b1e0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75  .** is only issu
b1f0: 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72  ed if bSep is tr
b200: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
b210: 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68  id output_csv(Sh
b220: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
b230: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b240: 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f  bSep){.  FILE *o
b250: 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69  ut = p->out;.  i
b260: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( z==0 ){.    u
b270: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
b280: 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  %s",p->nullValue
b290: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b2a0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
b2b0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
b2c0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
b2d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
b2e0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b2f0: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
b300: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
b310: 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20  *)z)[i]].       
b320: 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63    || (z[i]==p->c
b330: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26  olSeparator[0] &
b340: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
b350: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
b360: 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  p(z, p->colSepar
b370: 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29  ator, nSep)==0))
b380: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
b390: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
b3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b3b0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
b3c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f        char *zQuo
b3d0: 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ted = sqlite3_mp
b3e0: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
b3f0: 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  z);.      utf8_p
b400: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b410: 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20   zQuoted);.     
b420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
b430: 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73  uoted);.    }els
b440: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
b450: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
b460: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
b470: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
b480: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b490: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
b4a0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a  Separator);.  }.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b4c0: 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20  utine runs when 
b4d0: 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73  the user presses
b4e0: 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69   Ctrl-C.*/.stati
b4f0: 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74  c void interrupt
b500: 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74  _handler(int Not
b510: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
b520: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
b530: 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72  d);.  seenInterr
b540: 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65  upt++;.  if( see
b550: 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65  nInterrupt>2 ) e
b560: 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c  xit(1);.  if( gl
b570: 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33  obalDb ) sqlite3
b580: 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61  _interrupt(globa
b590: 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65  lDb);.}..#if (de
b5a0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
b5b0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
b5c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49   && !defined(_WI
b5d0: 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54  N32_WCE)./*.** T
b5e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
b5f0: 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65   for console eve
b600: 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43  nts (e.g. Ctrl-C
b610: 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74  ) on Win32.*/.st
b620: 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49  atic BOOL WINAPI
b630: 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64   ConsoleCtrlHand
b640: 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43  ler(.  DWORD dwC
b650: 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f  trlType /* One o
b660: 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45  f the CTRL_*_EVE
b670: 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  NT constants */.
b680: 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54  ){.  if( dwCtrlT
b690: 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e  ype==CTRL_C_EVEN
b6a0: 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75  T ){.    interru
b6b0: 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20  pt_handler(0);. 
b6c0: 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
b6d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c    }.  return FAL
b6e0: 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  SE;.}.#endif..#i
b6f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b700: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
b710: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22  /*.** When the "
b720: 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74  .auth ON" is set
b730: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
b740: 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62  authorizer callb
b750: 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  ack is.** invoke
b760: 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  d.  It always re
b770: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b790: 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64  hellAuth(.  void
b7a0: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20   *pClientData,. 
b7b0: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
b7c0: 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f   char *zA1,.  co
b7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20  nst char *zA2,. 
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33   const char *zA3
b7f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b800: 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  zA4.){.  ShellSt
b810: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
b820: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
b830: 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  a;.  static cons
b840: 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e  t char *azAction
b850: 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22  [] = { 0,.     "
b860: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20  CREATE_INDEX",  
b870: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54         "CREATE_T
b880: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22  ABLE",         "
b890: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
b8a0: 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45  X",.     "CREATE
b8b0: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20  _TEMP_TABLE",   
b8c0: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52   "CREATE_TEMP_TR
b8d0: 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45  IGGER",  "CREATE
b8e0: 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20  _TEMP_VIEW",.   
b8f0: 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45    "CREATE_TRIGGE
b900: 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54  R",       "CREAT
b910: 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  E_VIEW",        
b920: 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20    "DELETE",.    
b930: 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20   "DROP_INDEX",  
b940: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54           "DROP_T
b950: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b960: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45   "DROP_TEMP_INDE
b970: 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  X",.     "DROP_T
b980: 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  EMP_TABLE",     
b990: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47   "DROP_TEMP_TRIG
b9a0: 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54  GER",    "DROP_T
b9b0: 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20  EMP_VIEW",.     
b9c0: 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20  "DROP_TRIGGER", 
b9d0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49          "DROP_VI
b9e0: 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EW",            
b9f0: 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22  "INSERT",.     "
ba00: 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20  PRAGMA",        
ba10: 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20         "READ",  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba30: 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54  SELECT",.     "T
ba40: 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20  RANSACTION",    
ba50: 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20        "UPDATE", 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
ba70: 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45  TTACH",.     "DE
ba80: 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  TACH",          
ba90: 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c       "ALTER_TABL
baa0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45  E",          "RE
bab0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e  INDEX",.     "AN
bac0: 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20  ALYZE",         
bad0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41       "CREATE_VTA
bae0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52  BLE",        "DR
baf0: 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20  OP_VTABLE",.    
bb00: 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20   "FUNCTION",    
bb10: 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f           "SAVEPO
bb20: 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  INT",           
bb30: 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d   "RECURSIVE".  }
bb40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
bb50: 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a  st char *az[4];.
bb60: 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20    az[0] = zA1;. 
bb70: 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20   az[1] = zA2;.  
bb80: 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61  az[2] = zA3;.  a
bb90: 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74  z[3] = zA4;.  ut
bba0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bbb0: 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25  , "authorizer: %
bbc0: 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d  s", azAction[op]
bbd0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
bbe0: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77  4; i++){.    raw
bbf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
bc00: 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  " ");.    if( az
bc10: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74  [i] ){.      out
bc20: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
bc30: 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  out, az[i]);.   
bc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
bc50: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bc60: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
bc70: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
bc80: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
bc90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bca0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
bcb0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65  .** Print a sche
bcc0: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50  ma statement.  P
bcd0: 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69  art of MODE_Semi
bce0: 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79   and MODE_Pretty
bcf0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54   output..**.** T
bd00: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
bd10: 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45  erts some CREATE
bd20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
bd30: 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62  s for shadow tab
bd40: 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34  les.** in FTS3/4
bd50: 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54  /5 into CREATE T
bd60: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
bd70: 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  TS statements..*
bd80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
bd90: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49  intSchemaLine(FI
bda0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
bdb0: 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68  har *z, const ch
bdc0: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66  ar *zTail){.  if
bdd0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
bde0: 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b("CREATE TABLE 
bdf0: 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29  ['\"]*", z)==0 )
be00: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
be10: 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54  f(out, "CREATE T
be20: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
be30: 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20  TS %s%s", z+13, 
be40: 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTail);.  }else{
be50: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
be60: 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c  (out, "%s%s", z,
be70: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73   zTail);.  }.}.s
be80: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
be90: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45  SchemaLineN(FILE
bea0: 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20   *out, char *z, 
beb0: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61  int n, const cha
bec0: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61  r *zTail){.  cha
bed0: 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b  r c = z[n];.  z[
bee0: 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53  n] = 0;.  printS
bef0: 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a  chemaLine(out, z
bf00: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d  , zTail);.  z[n]
bf10: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = c;.}../*.** R
bf20: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74  eturn true if st
bf30: 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74  ring z[] has not
bf40: 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70  hing but whitesp
bf50: 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ace and comments
bf60: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
bf70: 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  f the first line
bf80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf90: 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68  wsToEol(const ch
bfa0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
bfb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
bfc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bfd0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74  z[i]=='\n' ) ret
bfe0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49  urn 1;.    if( I
bff0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63  sSpace(z[i]) ) c
c000: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
c010: 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[i]=='-' && z[
c020: 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75  i+1]=='-' ) retu
c030: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
c040: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c050: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
c060: 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
c070: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
c080: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
c090: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 61  tatic void eqp_a
c0a0: 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  ppend(ShellState
c0b0: 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 2c   *p, int iEqpId,
c0c0: 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63   int p2, const c
c0d0: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 45  har *zText){.  E
c0e0: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 77  QPGraphRow *pNew
c0f0: 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20  ;.  int nText = 
c100: 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29 3b  strlen30(zText);
c110: 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51  .  if( p->autoEQ
c120: 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74 66  Ptest ){.    utf
c130: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c140: 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20 69   "%d,%d,%s\n", i
c150: 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78 74  EqpId, p2, zText
c160: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  );.  }.  pNew = 
c170: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
c180: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
c190: 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66 28  + nText );.  if(
c1a0: 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c 6c   pNew==0 ) shell
c1b0: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
c1c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49 64  ;.  pNew->iEqpId
c1d0: 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e 65   = iEqpId;.  pNe
c1e0: 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20 70  w->iParentId = p
c1f0: 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  2;.  memcpy(pNew
c200: 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20  ->zText, zText, 
c210: 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77  nText+1);.  pNew
c220: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
c230: 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  f( p->sGraph.pLa
c240: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72  st ){.    p->sGr
c250: 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74  aph.pLast->pNext
c260: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65   = pNew;.  }else
c270: 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  {.    p->sGraph.
c280: 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pRow = pNew;.  }
c290: 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  .  p->sGraph.pLa
c2a0: 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  st = pNew;.}../*
c2b0: 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73  .** Free and res
c2c0: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
c2d0: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74  UERY PLAN data t
c2e0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c  hat has been col
c2f0: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  lected.** in p->
c300: 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69  sGraph..*/.stati
c310: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74  c void eqp_reset
c320: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c330: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c340: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c350: 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47  for(pRow = p->sG
c360: 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b  raph.pRow; pRow;
c370: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c380: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77      pNext = pRow
c390: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
c3a0: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
c3b0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
c3c0: 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a  ->sGraph, 0, siz
c3d0: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b  eof(p->sGraph));
c3e0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
c3f0: 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51  e next EXPLAIN Q
c400: 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77  UERY PLAN line w
c410: 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74 20  ith iEqpId that 
c420: 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a 20  occurs after.** 
c430: 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e 20  pOld, or return 
c440: 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20 6c  the first such l
c450: 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20 4e  ine if pOld is N
c460: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45 51  ULL.*/.static EQ
c470: 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f 6e  PGraphRow *eqp_n
c480: 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74 61  ext_row(ShellSta
c490: 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49  te *p, int iEqpI
c4a0: 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  d, EQPGraphRow *
c4b0: 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61 70  pOld){.  EQPGrap
c4c0: 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f 6c  hRow *pRow = pOl
c4d0: 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74 20  d ? pOld->pNext 
c4e0: 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77  : p->sGraph.pRow
c4f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77 20  ;.  while( pRow 
c500: 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e 74  && pRow->iParent
c510: 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52 6f  Id!=iEqpId ) pRo
c520: 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b  w = pRow->pNext;
c530: 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b 0a  .  return pRow;.
c540: 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20 73  }../* Render a s
c550: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74  ingle level of t
c560: 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68 61  he graph that ha
c570: 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73 20  s iEqpId as its 
c580: 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64 0a  parent.  Called.
c590: 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ** recursively t
c5a0: 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76 65  o render subleve
c5b0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
c5c0: 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65  id eqp_render_le
c5d0: 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  vel(ShellState *
c5e0: 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b 0a  p, int iEqpId){.
c5f0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c600: 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Row, *pNext;.  i
c610: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
c620: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c630: 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  x);.  char *z;. 
c640: 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70 5f   for(pRow = eqp_
c650: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c660: 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70 52  Id, 0); pRow; pR
c670: 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20  ow = pNext){.   
c680: 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65 78   pNext = eqp_nex
c690: 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c  t_row(p, iEqpId,
c6a0: 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20   pRow);.    z = 
c6b0: 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20 20  pRow->zText;.   
c6c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c6d0: 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22 2c  out, "%s%s%s\n",
c6e0: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c6f0: 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d 2d  ix, pNext ? "|--
c700: 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a 20  " : "`--", z);. 
c710: 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73 69     if( n<(int)si
c720: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a  zeof(p->sGraph.z
c730: 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20 20  Prefix)-7 ){.   
c740: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47     memcpy(&p->sG
c750: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 2c  raph.zPrefix[n],
c760: 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20 3a   pNext ? "|  " :
c770: 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20 20   "   ", 4);.    
c780: 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76    eqp_render_lev
c790: 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71 70  el(p, pRow->iEqp
c7a0: 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  Id);.      p->sG
c7b0: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 20  raph.zPrefix[n] 
c7c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c7d0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
c7e0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58  and reset the EX
c7f0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
c800: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
c810: 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 28  void eqp_render(
c820: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
c830: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c840: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
c850: 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f 77  pRow;.  if( pRow
c860: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 77   ){.    if( pRow
c870: 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27 20  ->zText[0]=='-' 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 6f  ){.      if( pRo
c890: 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  w->pNext==0 ){. 
c8a0: 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65 74         eqp_reset
c8b0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
c8c0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c8d0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c8e0: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 70  ->out, "%s\n", p
c8f0: 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a 20  Row->zText+3);. 
c900: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70       p->sGraph.p
c910: 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78  Row = pRow->pNex
c920: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
c930: 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 20  _free(pRow);.   
c940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
c950: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c960: 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22  , "QUERY PLAN\n"
c970: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
c980: 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 30  sGraph.zPrefix[0
c990: 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f 72  ] = 0;.    eqp_r
c9a0: 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 30  ender_level(p, 0
c9b0: 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65 74  );.    eqp_reset
c9c0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
c9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9e0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
c9f0: 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73 73  K./*.** Progress
ca00: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
ca10: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ca20: 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65   progress_handle
ca30: 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44  r(void *pClientD
ca40: 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53 74  ata) {.  ShellSt
ca50: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
ca60: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
ca70: 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73  a;.  p->nProgres
ca80: 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 50  s++;.  if( p->nP
ca90: 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50 72  rogress>=p->mxPr
caa0: 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78 50  ogress && p->mxP
cab0: 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20 20  rogress>0 ){.   
cac0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
cad0: 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c 69  ut, "Progress li
cae0: 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75 29  mit reached (%u)
caf0: 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73  \n", p->nProgres
cb00: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66  s);.    if( p->f
cb10: 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45  lgProgress & SHE
cb20: 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53 45  LL_PROGRESS_RESE
cb30: 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  T ) p->nProgress
cb40: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
cb50: 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53  >flgProgress & S
cb60: 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f 4e  HELL_PROGRESS_ON
cb70: 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72 65  CE ) p->mxProgre
cb80: 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ss = 0;.    retu
cb90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
cba0: 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20  (p->flgProgress 
cbb0: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cbc0: 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20 20  _QUIET)==0 ){.  
cbd0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cbe0: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 25  out, "Progress %
cbf0: 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  u\n", p->nProgre
cc00: 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ss);.  }.  retur
cc10: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
cc20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
cc30: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20 2a  GRESS_CALLBACK *
cc40: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
cc50: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
cc60: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73  utine that the s
cc70: 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  hell.** invokes 
cc80: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
cc90: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
cca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
ccb0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  ell_callback(.  
ccc0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
ccd0: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f  t nArg,        /
cce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
ccf0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
cd00: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
cd10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
cd20: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
cd30: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
cd40: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
cd50: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ames */.  int *a
cd60: 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f  iType      /* Co
cd70: 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b  lumn types */.){
cd80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c  .  int i;.  Shel
cd90: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
cda0: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a  llState*)pArg;..
cdb0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
cdc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
cdd0: 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b  tch( p->cMode ){
cde0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
cdf0: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
ce00: 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66   w = 5;.      if
ce10: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
ce20: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
ce30: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ce40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
ce50: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f   = strlen30(azCo
ce60: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
ce70: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69  : "");.        i
ce80: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
ce90: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
cea0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
ceb0: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
cec0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
ced0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
cee0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cef0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cf00: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cf10: 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73  p->out,"%*s = %s
cf20: 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  %s", w, azCol[i]
cf30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf40: 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41    azArg[i] ? azA
cf50: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
cf60: 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61  alue, p->rowSepa
cf70: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
cf80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf90: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
cfa0: 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61  _Explain:.    ca
cfb0: 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20  se MODE_Column: 
cfc0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
cfd0: 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69  onst int aExplai
cfe0: 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20  nWidths[] = {4, 
cff0: 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c  13, 4, 4, 4, 13,
d000: 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63   2, 13};.      c
d010: 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64  onst int *colWid
d020: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68  th;.      int sh
d030: 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61  owHdr;.      cha
d040: 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20  r *rowSep;.     
d050: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
d060: 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  ODE_Column ){.  
d070: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
d080: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20   p->colWidth;.  
d090: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
d0a0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
d0b0: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
d0c0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b  p->rowSeparator;
d0d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d0e0: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
d0f0: 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b   aExplainWidths;
d100: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
d110: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f   = 1;.        ro
d120: 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a  wSep = SEP_Row;.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d140: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b  ( p->cnt++==0 ){
d150: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
d160: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d170: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c            int w,
d180: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   n;.          if
d190: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
d1a0: 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  >colWidth) ){.  
d1b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f            w = co
d1c0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
d1d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d1e0: 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20          w = 0;. 
d1f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d200: 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b       if( w==0 ){
d210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d220: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f   strlenChar(azCo
d230: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
d240: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
d250: 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20     if( w<10 ) w 
d260: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
d270: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    n = strlenChar
d280: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
d290: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
d2a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
d2c0: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
d2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d2e0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d2f0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d310: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
d320: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
d330: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
d340: 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20  ( showHdr ){.   
d350: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69           utf8_wi
d360: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
d370: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  , w, azCol[i]);.
d380: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d390: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d3a0: 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  "%s", i==nArg-1 
d3b0: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d3e0: 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20  if( showHdr ){. 
d3f0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
d400: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d410: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d420: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  w;.            i
d430: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d440: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
d450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d460: 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69   w = p->actualWi
d470: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
d480: 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29         if( w<0 )
d490: 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20   w = -w;.       
d4a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d4b0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
d4c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d4e0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d4f0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a  "%-*.*s%s",w,w,.
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a  --------------".
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c  --------------",
d5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5b0: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
d5c0: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
d5d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d5f0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
d600: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
d610: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d630: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69  int w;.        i
d640: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d650: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
d660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
d670: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
d680: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
d690: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  e{.           w 
d6a0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
d6b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63          if( p->c
d6c0: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  Mode==MODE_Expla
d6d0: 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26  in && azArg[i] &
d6e0: 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  & strlenChar(azA
d6f0: 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20  rg[i])>w ){.    
d700: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
d710: 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  Char(azArg[i]);.
d720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d730: 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d    if( i==1 && p-
d740: 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e  >aiIndent && p->
d750: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
d760: 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e     if( p->iInden
d770: 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a  t<p->nIndent ){.
d780: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d790: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d7a0: 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64  "%*.s", p->aiInd
d7b0: 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c  ent[p->iIndent],
d7c0: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
d7d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  }.          p->i
d7e0: 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  Indent++;.      
d7f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
d800: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
d810: 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d  out, w, azArg[i]
d820: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
d830: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
d840: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d850: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
d860: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
d870: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
d880: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d890: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d8a0: 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a  ODE_Semi: {   /*
d8b0: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
d8c0: 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20  llschema output 
d8d0: 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63  */.      printSc
d8e0: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
d8f0: 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22   azArg[0], ";\n"
d900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d910: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d920: 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f  ODE_Pretty: {  /
d930: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d940: 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d  ullschema with -
d950: 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20  -indent */.     
d960: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
d970: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  int j;.      int
d980: 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20   nParen = 0;.   
d990: 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30     char cEnd = 0
d9a0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
d9b0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20        int nLine 
d9c0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
d9d0: 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
d9e0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d      if( azArg[0]
d9f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
da00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
da10: 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56  trlike("CREATE V
da20: 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c  IEW%", azArg[0],
da30: 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c   0)==0.       ||
da40: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
da50: 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c  ("CREATE TRIG%",
da60: 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30   azArg[0], 0)==0
da70: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
da80: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
da90: 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61  >out, "%s;\n", a
daa0: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
dab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
dac0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
dad0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
dae0: 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
daf0: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66    j = 0;.      f
db00: 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28  or(i=0; IsSpace(
db10: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
db20: 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a      for(; (c = z
db30: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
db40: 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61         if( IsSpa
db50: 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  ce(c) ){.       
db60: 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27     if( z[j-1]=='
db70: 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27  \r' ) z[j-1] = '
db80: 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  \n';.          i
db90: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31  f( IsSpace(z[j-1
dba0: 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28  ]) || z[j-1]=='(
dbb0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
dbc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbd0: 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29  (c=='(' || c==')
dbe0: 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53  ') && j>0 && IsS
dbf0: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a  pace(z[j-1]) ){.
dc00: 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20            j--;. 
dc10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc20: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20   z[j++] = c;.   
dc30: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
dc40: 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  ( j>0 && IsSpace
dc50: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b  (z[j-1]) ){ j--;
dc60: 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20   }.      z[j] = 
dc70: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  0;.      if( str
dc80: 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a  len30(z)>=79 ){.
dc90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d          for(i=j=
dca0: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
dcb0: 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79  ; i++){  /* Copy
dcc0: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b   changes from z[
dcd0: 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20  i] back to z[j] 
dce0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
dcf0: 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20   c==cEnd ){.    
dd00: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30          cEnd = 0
dd10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dd20: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
dd30: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
dd40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
dd50: 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20   cEnd = c;.     
dd60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
dd70: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
dd80: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b       cEnd = ']';
dd90: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
dda0: 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a   if( c=='-' && z
ddb0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  [i+1]=='-' ){.  
ddc0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
ddd0: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
dde0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28   }else if( c=='(
ddf0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
de00: 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20   nParen++;.     
de10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
de20: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
de30: 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20       nParen--;. 
de40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
de50: 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e  Line>0 && nParen
de60: 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20  ==0 && j>0 ){.  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
de80: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
de90: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29  out, z, j, "\n")
dea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
deb0: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
dec0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
ded0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
dee0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
def0: 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26   if( nParen==1 &
df00: 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20  & cEnd==0.      
df10: 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20       && (c=='(' 
df20: 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63  || c=='\n' || (c
df30: 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f  ==',' && !wsToEo
df40: 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20  l(z+i+1))).     
df50: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
df60: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
df70: 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ) j--;.         
df80: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
df90: 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a  neN(p->out, z, j
dfa0: 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20  , "\n  ");.     
dfb0: 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20         j = 0;.  
dfc0: 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b            nLine+
dfd0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  +;.            w
dfe0: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b  hile( IsSpace(z[
dff0: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
e000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
e020: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  j] = 0;.      }.
e030: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
e040: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c  aLine(p->out, z,
e050: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73   ";\n");.      s
e060: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
e070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e080: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e090: 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69  _List: {.      i
e0a0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
e0b0: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
e0c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
e0d0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e0f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e100: 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a  %s%s",azCol[i],.
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d    i==nArg-1 ? p-
e130: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20  >rowSeparator : 
e140: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e160: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e170: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e180: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e190: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e1a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
e1b0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
e1c0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
e1d0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20  p->nullValue;.  
e1e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e1f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e200: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
e210: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
e220: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e230: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e240: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e250: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e260: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e270: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e280: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e290: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e2b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e2c0: 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20  case MODE_Html: 
e2d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e2e0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e2f0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e300: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e310: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
e320: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e330: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e340: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e350: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22  tf(p->out,"<TH>"
e360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
e370: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
e380: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
e390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
e3a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3b0: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
e3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
e3d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3e0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e3f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e400: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e410: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e420: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e430: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e440: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e450: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e460: 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a  p->out,"<TD>");.
e470: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e480: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
e490: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
e4a0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
e4b0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e4c0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e4d0: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
e4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
e4f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
e500: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
e510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e520: 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20   case MODE_Tcl: 
e530: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e540: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e550: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e560: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e570: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e580: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
e590: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f  ring(p->out,azCo
e5a0: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
e5b0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
e5c0: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
e5d0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e5e0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
e5f0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e600: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e610: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e620: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e630: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e640: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
e650: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e670: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e680: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
e690: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
e6a0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
e6b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
e6c0: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
e6d0: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
e6e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e6f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
e700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
e710: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e720: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e730: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
e740: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e750: 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b  case MODE_Csv: {
e760: 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79  .      setBinary
e770: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
e780: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
e790: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
e7a0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
e7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e7c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e7d0: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
e7e0: 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  , azCol[i] ? azC
e7f0: 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41  ol[i] : "", i<nA
e800: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
e810: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e820: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e830: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e840: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
e850: 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b     if( nArg>0 ){
e860: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
e870: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e880: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e890: 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d  _csv(p, azArg[i]
e8a0: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
e8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
e8c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e8d0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
e8e0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e8f0: 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74   }.      setText
e900: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
e910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e920: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e930: 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20  E_Insert: {.    
e940: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
e950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74   break;.      ut
e960: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e970: 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73  ,"INSERT INTO %s
e980: 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  ",p->zDestTable)
e990: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  ;.      if( p->s
e9a0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e9b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e9c0: 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20  p->out,"(");.   
e9d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e9e0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e9f0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ea00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ea10: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
ea20: 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72     if( quoteChar
ea30: 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  (azCol[i]) ){.  
ea40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
ea50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
ea60: 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a  ntf("\"%w\"", az
ea70: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
ea80: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ea90: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
eaa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
eab0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
eac0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ead0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
eae0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
eaf0: 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  "%s", azCol[i]);
eb00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
eb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
eb20: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
eb30: 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,")");.      }. 
eb40: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
eb50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
eb60: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
eb70: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
eb80: 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22  ->out, i>0 ? ","
eb90: 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a   : " VALUES(");.
eba0: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
ebb0: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
ebc0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ebd0: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
ebe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ebf0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ec00: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
ec10: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
ec20: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
ec30: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
ec40: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65           if( She
ec50: 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
ec60: 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a  LG_Newlines) ){.
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
ec80: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
ec90: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
eca0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]);.          }e
ecb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ecc0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
ecd0: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d  scaped_string(p-
ece0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
ecf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ed00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ed10: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ed20: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
ed30: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
ed40: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ed50: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ed60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ed70: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ed80: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ed90: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
eda0: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
edb0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
edc0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
edd0: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
ede0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
edf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
ee00: 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20 20  64 ur;.         
ee10: 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c 73   memcpy(&ur,&r,s
ee20: 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20  izeof(r));.     
ee30: 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37       if( ur==0x7
ee40: 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c  ff0000000000000L
ee50: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
ee60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ee70: 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20 20  ut, "1e999");.  
ee80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ee90: 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30 30  ( ur==0xfff00000
eea0: 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20  00000000LL ){.  
eeb0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
eec0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31  intf(p->out, "-1
eed0: 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20  e999");.        
eee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
eef0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ef00: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
ef10: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
ef20: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ef30: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
ef40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ef50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ef60: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ef70: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
ef80: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
ef90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
efa0: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
efb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
efc0: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
efd0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
efe0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
eff0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
f000: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
f010: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
f020: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
f030: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
f040: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
f050: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
f060: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
f070: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f080: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
f090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f0a0: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
f0b0: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
f0c0: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
f0d0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
f0e0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
f0f0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
f100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f110: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f120: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
f130: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f150: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
f160: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
f170: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
f180: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f190: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a  e MODE_Quote: {.
f1a0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
f1b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f1c0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20    if( p->cnt==0 
f1d0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
f1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
f1f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f210: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
f220: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
f230: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
f240: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
f250: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
f260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f270: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f280: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
f290: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e     }.      p->cn
f2a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t++;.      for(i
f2b0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f2c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
f2d0: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
f2e0: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
f2f0: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
f300: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
f310: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f320: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
f330: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f340: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
f350: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
f360: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f370: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f380: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
f390: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
f3a0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
f3b0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
f3c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f3d0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
f3e0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
f3f0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
f400: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f410: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
f420: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f430: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
f440: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
f450: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
f460: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
f470: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
f480: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
f490: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
f4a0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f4c0: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
f4d0: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
f4e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f4f0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
f500: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f510: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f520: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
f530: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
f540: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
f550: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
f560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f570: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
f580: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
f590: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
f5a0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
f5b0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f5c0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
f5d0: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
f5e0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
f5f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
f600: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
f610: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
f620: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f630: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
f640: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f650: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
f660: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
f670: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
f680: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
f690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
f6a0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f6b0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
f6c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f6d0: 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b  se MODE_Ascii: {
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
f6f0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
f700: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
f710: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
f720: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
f730: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
f740: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f750: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
f760: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
f770: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f780: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f  p->out,"%s",azCo
f790: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
f7a0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  : "");.        }
f7b0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
f7c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7d0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
f7e0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
f7f0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
f800: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
f810: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f820: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
f830: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
f840: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f850: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
f860: 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  r);.        utf8
f870: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f880: 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61  %s",azArg[i] ? a
f890: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
f8a0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  lValue);.      }
f8b0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
f8c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f8d0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
f8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
f900: 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20  ODE_EQP: {.     
f910: 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61   eqp_append(p, a
f920: 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61  toi(azArg[0]), a
f930: 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61  toi(azArg[1]), a
f940: 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20  zArg[3]);.      
f950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f960: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
f980: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
f990: 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69  ne that the SQLi
f9a0: 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e  te library.** in
f9b0: 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72  vokes for each r
f9c0: 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65  ow of a query re
f9d0: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
f9e0: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69  int callback(voi
f9f0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
fa00: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
fa10: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a   char **azCol){.
fa20: 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f    /* since we do
fa30: 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e  n't have type in
fa40: 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65  fo, call the she
fa50: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ll_callback with
fa60: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f   a NULL value */
fa70: 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f  .  return shell_
fa80: 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  callback(pArg, n
fa90: 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f  Arg, azArg, azCo
faa0: 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  l, NULL);.}../*.
fab0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
fac0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
fad0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65  from sqlite3_exe
fae0: 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73  c() that appends
faf0: 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f   all.** output o
fb00: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61  nto the end of a
fb10: 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63   ShellText objec
fb20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
fb30: 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61   captureOutputCa
fb40: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
fb50: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
fb60: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
fb70: 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65  **az){.  ShellTe
fb80: 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65  xt *p = (ShellTe
fb90: 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20  xt*)pArg;.  int 
fba0: 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
fbb0: 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28  METER(az);.  if(
fbc0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
fbd0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  rn 0;.  if( p->n
fbe0: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
fbf0: 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28   "|", 0);.  for(
fc00: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
fc10: 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61  ){.    if( i ) a
fc20: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22  ppendText(p, ","
fc30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
fc40: 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54  Arg[i] ) appendT
fc50: 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  ext(p, azArg[i],
fc60: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
fc70: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
fc80: 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70  nerate an approp
fc90: 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74  riate SELFTEST t
fca0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
fcb0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
fcc0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
fcd0: 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68  SelftestTable(Sh
fce0: 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
fcf0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
fd00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  0;.  sqlite3_exe
fd10: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41  c(p->db,.    "SA
fd20: 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74  VEPOINT selftest
fd30: 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43  _init;\n".    "C
fd40: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
fd50: 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65  OT EXISTS selfte
fd60: 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e  st(\n".    "  tn
fd70: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
fd80: 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54  Y KEY,\n"   /* T
fd90: 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  est number */.  
fda0: 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22    "  op TEXT,\n"
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20     /* Operator: 
fdd0: 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20   memo run */.   
fde0: 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22   "  cmd TEXT,\n"
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78    /* Command tex
fe10: 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20  t */.    "  ans 
fe20: 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20  TEXT\n"         
fe30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
fe40: 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20  ired answer */. 
fe50: 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45     ");".    "CRE
fe60: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b  ATE TEMP TABLE [
fe70: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c  _shell$self](op,
fe80: 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20  cmd,ans);\n".   
fe90: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
fea0: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69  shell$self](rowi
feb0: 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20  d,op,cmd)\n".   
fec0: 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65   "  VALUES(coale
fed0: 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78  sce((SELECT (max
fee0: 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52  (tno)+100)/10 FR
fef0: 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29  OM selftest),10)
ff00: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  ,\n".    "      
ff10: 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73     'memo','Tests
ff20: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d   generated by --
ff30: 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22  init');\n".    "
ff40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
ff50: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
ff60: 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
ff70: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53  ,\n".    "    'S
ff80: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
ff90: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79  uery(''SELECT ty
ffa0: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
ffb0: 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
ffe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
fff0: 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c  R BY 2'',224))',
10000 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78  \n".    "    hex
10010 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c  (sha3_query('SEL
10020 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
10030 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20  l_name,sql ".   
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
10060 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
10070 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22   BY 2',224));\n"
10080 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
10090 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
100a0 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  n".    "  SELECT
100b0 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20   'run',".    "  
100c0 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68    'SELECT hex(sh
100d0 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43  a3_query(''SELEC
100e0 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22  T * FROM \"' ||"
100f0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72  .    "        pr
10100 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20  intf('%w',name) 
10110 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58  || '\" NOT INDEX
10120 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a  ED'',224))',\n".
10130 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
10140 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27  3_query(printf('
10150 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
10160 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44  %w\" NOT INDEXED
10170 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22  ',name),224))\n"
10180 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e  .    "  FROM (\n
10190 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
101a0 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
101b0 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
101c0 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70   "     WHERE typ
101d0 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20  e='table'\n".   
101e0 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d   "       AND nam
101f0 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22  e<>'selftest'\n"
10200 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44  .    "       AND
10210 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
10220 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22  ge,0)>0\n".    "
10230 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44    )\n".    " ORD
10240 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20  ER BY name;\n". 
10250 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
10260 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22  [_shell$self]\n"
10270 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27  .    "  VALUES('
10280 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74  run','PRAGMA int
10290 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f  egrity_check','o
102a0 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  k');\n".    "INS
102b0 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73  ERT INTO selftes
102c0 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73  t(tno,op,cmd,ans
102d0 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  )".    "  SELECT
102e0 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64   rowid*10,op,cmd
102f0 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c  ,ans FROM [_shel
10300 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20  l$self];\n".    
10310 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68  "DROP TABLE [_sh
10320 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20  ell$self];".    
10330 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a  ,0,0,&zErrMsg);.
10340 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
10350 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10360 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45  (stderr, "SELFTE
10370 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ST initializatio
10380 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22  n failure: %s\n"
10390 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
103a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
103b0 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rMsg);.  }.  sql
103c0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
103d0 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65   "RELEASE selfte
103e0 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b  st_init",0,0,0);
103f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
10400 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
10410 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68  able field of th
10420 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72  e ShellState str
10430 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65  ucture to.** the
10440 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10450 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70  le given.  Escap
10460 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72  e any quote char
10470 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  acters in the.**
10480 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a   table name..*/.
10490 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f  static void set_
104a0 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c  table_name(Shell
104b0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
104c0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
104d0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72  int i, n;.  char
104e0 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20   cQuote;.  char 
104f0 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44  *z;..  if( p->zD
10500 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  estTable ){.    
10510 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62  free(p->zDestTab
10520 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  le);.    p->zDes
10530 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  tTable = 0;.  }.
10540 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
10550 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74   return;.  cQuot
10560 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e  e = quoteChar(zN
10570 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c  ame);.  n = strl
10580 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
10590 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d  f( cQuote ) n +=
105a0 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a   n+2;.  z = p->z
105b0 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
105c0 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
105d0 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75   z==0 ) shell_ou
105e0 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
105f0 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51   n = 0;.  if( cQ
10600 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
10610 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d  cQuote;.  for(i=
10620 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b  0; zName[i]; i++
10630 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20  ){.    z[n++] = 
10640 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66  zName[i];.    if
10650 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f  ( zName[i]==cQuo
10660 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
10670 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uote;.  }.  if( 
10680 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
10690 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d  = cQuote;.  z[n]
106a0 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
106b0 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
106c0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
106d0 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c  ill generate SQL
106e0 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a   output.  Print.
106f0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
10700 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70  lumns, comma-sep
10710 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e  arated, on a lin
10720 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61  e and then add a
10730 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  .** semicolon te
10740 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20  rminator to the 
10750 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65  end of that line
10760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
10770 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10780 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63   is 1 and that c
10790 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
107a0 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e  ext "--".** then
107b0 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63   write the semic
107c0 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61  olon on a separa
107d0 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77  te line.  That w
107e0 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22  ay, if a.** "--"
107f0 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20   comment occurs 
10800 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10810 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
10820 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27   comment.** won'
10830 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65  t consume the se
10840 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
10850 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
10860 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70  t run_table_dump
10870 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53  _query(.  ShellS
10880 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
10890 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74     /* Query cont
108a0 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
108b0 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20  har *zSelect,   
108c0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
108d0 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74  ement to extract
108e0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f   content */.  co
108f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74  nst char *zFirst
10900 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20  Row    /* Print 
10910 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77  before first row
10920 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
10930 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10940 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69  mt *pSelect;.  i
10950 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
10960 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sult;.  int i;. 
10970 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
10990 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
109a0 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70   zSelect, -1, &p
109b0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
109c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
109d0 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20  || !pSelect ){. 
109e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
109f0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
10a00 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
10a10 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20  **/\n", rc,.    
10a20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10a30 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
10a40 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
10a50 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
10a60 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
10a70 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  +;.    return rc
10a80 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
10a90 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
10aa0 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20  t);.  nResult = 
10ab0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
10ac0 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  ount(pSelect);. 
10ad0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
10ae0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66  TE_ROW ){.    if
10af0 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20  ( zFirstRow ){. 
10b00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
10b10 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
10b20 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20  FirstRow);.     
10b30 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a   zFirstRow = 0;.
10b40 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63      }.    z = (c
10b50 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
10b60 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
10b70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
10b80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10b90 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
10ba0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65    for(i=1; i<nRe
10bb0 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
10bc0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10bd0 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c  >out, ",%s", sql
10be0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
10bf0 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20  (pSelect, i));. 
10c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d     }.    if( z==
10c10 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20  0 ) z = "";.    
10c20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28  while( z[0] && (
10c30 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31  z[0]!='-' || z[1
10c40 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20  ]!='-') ) z++;. 
10c50 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20     if( z[0] ){. 
10c60 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10c70 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29  p->out, "\n;\n")
10c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
10ca0 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  >out, ";\n");.  
10cb0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
10cc0 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
10cd0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
10ce0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
10cf0 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
10d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10d10 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10d20 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
10d30 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
10d40 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10d60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
10d70 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
10d80 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
10d90 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
10da0 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
10db0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10dc0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e  llocate space an
10dd0 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65  d save off curre
10de0 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e  nt error string.
10df0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
10e00 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20  *save_err_msg(. 
10e10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20   sqlite3 *db    
10e20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10e30 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
10e40 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67  ){.  int nErrMsg
10e50 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71   = 1+strlen30(sq
10e60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10e70 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  );.  char *zErrM
10e80 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  sg = sqlite3_mal
10e90 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a  loc64(nErrMsg);.
10ea0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
10eb0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72  .    memcpy(zErr
10ec0 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Msg, sqlite3_err
10ed0 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67  msg(db), nErrMsg
10ee0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10ef0 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64  zErrMsg;.}..#ifd
10f00 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a  ef __linux__./*.
10f10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69  ** Attempt to di
10f20 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20  splay I/O stats 
10f30 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f  on Linux using /
10f40 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73  proc/PID/io.*/.s
10f50 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
10f60 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46  ayLinuxIoStats(F
10f70 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c  ILE *out){.  FIL
10f80 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b  E *in;.  char z[
10f90 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
10fa0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10fb0 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64  z), z, "/proc/%d
10fc0 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b  /io", getpid());
10fd0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c  .  in = fopen(z,
10fe0 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e   "rb");.  if( in
10ff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11000 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20  while( fgets(z, 
11010 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d  sizeof(z), in)!=
11020 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
11030 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
11040 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11050 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20  *zPattern;.     
11060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
11070 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73  sc;.    } aTrans
11080 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
11090 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  rchar: ",       
110a0 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
110b0 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65  s received by re
110c0 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20  ad():" },.      
110d0 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20  { "wchar: ",    
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
110f0 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69  ytes sent to wri
11100 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20  te():"    },.   
11110 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20     { "syscr: ", 
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20   "Read() system 
11140 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a  calls:"      },.
11150 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20        { "syscw: 
11160 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11170 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73      "Write() sys
11180 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20  tem calls:"     
11190 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64  },.      { "read
111a0 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20  _bytes: ",      
111b0 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65         "Bytes re
111c0 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a  ad from storage:
111d0 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77  "  },.      { "w
111e0 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
111f0 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
11200 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72   written to stor
11210 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  age:" },.      {
11220 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74   "cancelled_writ
11230 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61  e_bytes: ",  "Ca
11240 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79  ncelled write by
11250 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  tes:"    },.    
11260 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  };.    int i;.  
11270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
11280 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20  aySize(aTrans); 
11290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
112a0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72  n = strlen30(aTr
112b0 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29  ans[i].zPattern)
112c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
112d0 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  cmp(aTrans[i].zP
112e0 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  attern, z, n)==0
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
11300 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11310 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b  36s %s", aTrans[
11320 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29  i].zDesc, &z[n])
11330 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
11340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11350 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
11360 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
11370 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c   Display a singl
11380 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73  e line of status
11390 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61   using 64-bit va
113a0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
113b0 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74  void displayStat
113c0 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61  Line(.  ShellSta
113d0 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
113e0 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63    /* The shell c
113f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72  ontext */.  char
11400 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20   *zLabel,       
11410 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
11420 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65  or this one line
11430 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72   */.  char *zFor
11440 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
11450 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68  /* Format for th
11460 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e  e result */.  in
11470 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20  t iStatusCtrl,  
11480 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
11490 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c   status to displ
114a0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  ay */.  int bRes
114b0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
114c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
114d0 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
114e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
114f0 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20  64 iCur = -1;.  
11500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48  sqlite3_int64 iH
11510 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  iwtr = -1;.  int
11520 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20   i, nPercent;.  
11530 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b  char zLine[200];
11540 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
11550 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c  s64(iStatusCtrl,
11560 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11570 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28   bReset);.  for(
11580 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b  i=0, nPercent=0;
11590 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b   zFormat[i]; i++
115a0 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d  ){.    if( zForm
115b0 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65  at[i]=='%' ) nPe
115c0 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rcent++;.  }.  i
115d0 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b  f( nPercent>1 ){
115e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
115f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
11600 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72  ne), zLine, zFor
11610 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74  mat, iCur, iHiwt
11620 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
11630 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11640 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
11650 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
11660 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20   iHiwtr);.  }.  
11670 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
11680 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11690 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b   zLabel, zLine);
116a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
116b0 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a  y memory stats..
116c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
116d0 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73  splay_stats(.  s
116e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
116f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
11700 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
11710 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
11720 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
11730 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
11740 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69  hellState */.  i
11750 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
11760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11770 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
11780 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  stats */.){.  in
11790 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48  t iCur;.  int iH
117a0 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75  iwtr;.  FILE *ou
117b0 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30  t;.  if( pArg==0
117c0 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30   || pArg->out==0
117d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f   ) return 0;.  o
117e0 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a  ut = pArg->out;.
117f0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
11800 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61  mt && (pArg->sta
11810 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20  tsOn & 2) ){.   
11820 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b   int nCol, i, x;
11830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
11840 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d  t *pStmt = pArg-
11850 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  >pStmt;.    char
11860 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f   z[100];.    nCo
11870 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
11880 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
11890 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
118a0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e  out, "%-36s %d\n
118b0 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75  ", "Number of ou
118c0 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20  tput columns:", 
118d0 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  nCol);.    for(i
118e0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
118f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11900 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
11910 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20  z),z,"Column %d 
11920 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29  %nname:", i, &x)
11930 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11940 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11950 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11960 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
11970 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66  tmt,i));.#ifndef
11980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
11990 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69  LTYPE.      sqli
119a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
119b0 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20   z+x, "declared 
119c0 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  type:");.      u
119d0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
119e0 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
119f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11a00 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20  decltype(pStmt, 
11a10 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i));.#endif.#ifd
11a20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11a30 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
11a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11a50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11a60 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a   "database name:
11a70 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11a80 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11a90 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
11ab0 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ase_name(pStmt,i
11ac0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11ad0 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11ae0 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a  +x, "table name:
11af0 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11b00 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11b10 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11b20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
11b30 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11b50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11b60 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29   "origin name:")
11b70 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11b80 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11b90 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11ba0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
11bb0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11bc0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
11bd0 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ..  displayStatL
11be0 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
11bf0 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22  y Used:",.     "
11c00 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
11c10 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11c20 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
11c30 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  D, bReset);.  di
11c40 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11c50 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  rg, "Number of O
11c60 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
11c70 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22  ations:",.     "
11c80 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
11c90 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11ca0 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52  MALLOC_COUNT, bR
11cb0 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72  eset);.  if( pAr
11cc0 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
11cd0 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
11ce0 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  {.    displaySta
11cf0 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11d00 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61  ber of Pcache Pa
11d10 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20  ges Used:",.    
11d20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11d30 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49  ld) pages", SQLI
11d40 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11d50 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74  CHE_USED, bReset
11d60 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79  );.  }.  display
11d70 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11d80 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11d90 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
11da0 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11db0 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
11dc0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11dd0 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f  AGECACHE_OVERFLO
11de0 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  W, bReset);.  di
11df0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11e00 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c  rg, "Largest All
11e10 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11e20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11e30 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
11e40 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  OC_SIZE, bReset)
11e50 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ;.  displayStatL
11e60 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65  ine(pArg, "Large
11e70 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
11e80 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
11e90 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
11ea0 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11eb0 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  HE_SIZE, bReset)
11ec0 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b  ;.#ifdef YYTRACK
11ed0 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20  MAXSTACKDEPTH.  
11ee0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11ef0 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50  pArg, "Deepest P
11f00 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20  arser Stack:",. 
11f10 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11f20 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
11f30 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43  ATUS_PARSER_STAC
11f40 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64  K, bReset);.#end
11f50 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  if..  if( db ){.
11f60 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
11f70 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11f80 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20  Lookaside ){.   
11f90 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
11fa0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
11fb0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
11fc0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
11fd0 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
11fe0 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
11ff0 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
12000 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
12010 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
12020 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
12040 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
12050 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
12060 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
12070 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12080 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
12090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
120a0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
120b0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
120c0 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20  KASIDE_HIT,.    
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
120f0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
12100 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12110 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73  rg->out, "Succes
12120 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61  sful lookaside a
12130 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25  ttempts:       %
12140 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
12150 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
12160 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12170 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12180 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
12190 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20  DE_MISS_SIZE,.  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
121c0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
121d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
121e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
121f0 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
12200 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
12210 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
12220 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
12230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
12240 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
12250 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
12260 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a  SIDE_MISS_FULL,.
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
12290 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
122a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
122b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
122c0 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
122d0 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20   due to OOM:    
122e0 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
122f0 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
12300 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
12310 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12320 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12330 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12340 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
12350 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
12360 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12370 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12380 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
12390 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
123b0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
123c0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
123d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
123e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
123f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12400 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12410 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72  CACHE_HIT, &iCur
12420 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
12430 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12440 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
12450 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12470 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12480 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
12490 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
124a0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
124b0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
124c0 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
124d0 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
124e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
124f0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
12500 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12520 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12530 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
12540 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
12550 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
12560 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
12570 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
12580 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12590 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
125a0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
125b0 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
125e0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
125f0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12600 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12610 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12620 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43  CACHE_SPILL, &iC
12630 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12640 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12650 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12660 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20   cache spills:  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12690 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
126a0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
126b0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
126c0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
126d0 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
126e0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
126f0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12700 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12710 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73   "Schema Heap Us
12720 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
12730 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
12740 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12750 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12760 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12770 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12780 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12790 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
127a0 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
127b0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
127c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
127d0 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
127e0 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
127f0 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
12800 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
12810 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d        iCur);.  }
12820 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
12830 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20  tmt ){.    iCur 
12840 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12850 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12860 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12870 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
12880 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EP,.            
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20     bReset);.    
128b0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
128c0 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20  >out, "Fullscan 
128d0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
128e0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
128f0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
12900 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
12910 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
12920 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
12930 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52  TSTATUS_SORT, bR
12940 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12950 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12960 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e   "Sort Operation
12970 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12980 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12990 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129b0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
129c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
129d0 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65  US_AUTOINDEX,bRe
129e0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
129f0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12a00 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72  "Autoindex Inser
12a10 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
12a20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12a30 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12a40 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12a50 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12a60 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12a70 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65  S_VM_STEP, bRese
12a80 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
12a90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56  tf(pArg->out, "V
12aa0 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53  irtual Machine S
12ab0 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
12ac0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12ad0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12ae0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12af0 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12b00 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12b10 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65  REPREPARE, bRese
12b20 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
12b30 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52  tf(pArg->out, "R
12b40 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69  eprepare operati
12b50 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  ons:            
12b60 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12b70 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12b80 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12b90 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12ba0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12bb0 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  RUN, bReset);.  
12bc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12bd0 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
12be0 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20  of times run:   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12c00 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12c10 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12c20 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12c30 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12c40 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45  TMTSTATUS_MEMUSE
12c50 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  D, bReset);.    
12c60 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12c70 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73  >out, "Memory us
12c80 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73  ed by prepared s
12c90 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e  tmt:        %d\n
12ca0 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23  ", iCur);.  }..#
12cb0 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
12cc0 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f    displayLinuxIo
12cd0 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29  Stats(pArg->out)
12ce0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
12cf0 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69  o not remove thi
12d00 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62  s machine readab
12d10 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72  le comment: extr
12d20 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68  a-stats-output-h
12d30 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ere */..  return
12d40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
12d50 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e  play scan stats.
12d60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12d70 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
12d80 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
12d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12da0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12db0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
12dc0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20  hellState *pArg 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12de0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
12df0 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69  llState */.){.#i
12e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
12e10 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
12e20 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  TUS.  UNUSED_PAR
12e30 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
12e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12e50 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Arg);.#else.  in
12e60 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20  t i, k, n, mx;. 
12e70 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12e80 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12e90 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d   scanstats -----
12ea0 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20  ---\n");.  mx = 
12eb0 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  0;.  for(k=0; k<
12ec0 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64  =mx; k++){.    d
12ed0 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d  ouble rEstLoop =
12ee0 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   1.0;.    for(i=
12ef0 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20  n=0; 1; i++){.  
12f00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12f10 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d   *p = pArg->pStm
12f20 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12f30 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56  _int64 nLoop, nV
12f40 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62  isit;.      doub
12f50 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69  le rEst;.      i
12f60 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63  nt iSid;.      c
12f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
12f80 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ain;.      if( s
12f90 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
12fa0 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
12fb0 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f  ITE_SCANSTAT_NLO
12fc0 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f  OP, (void*)&nLoo
12fd0 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  p) ){.        br
12fe0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12ff0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
13000 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
13010 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
13020 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64  _SELECTID, (void
13030 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20  *)&iSid);.      
13040 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78  if( iSid>mx ) mx
13050 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69   = iSid;.      i
13060 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e  f( iSid!=k ) con
13070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
13080 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
13090 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75   rEstLoop = (dou
130a0 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20  ble)nLoop;.     
130b0 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77     if( k>0 ) raw
130c0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
130d0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62  t, "-------- sub
130e0 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d  query %d -------
130f0 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d  \n", k);.      }
13100 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13110 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13120 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
13130 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
13140 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
13150 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73  nVisit);.      s
13160 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
13170 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
13180 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54  ITE_SCANSTAT_EST
13190 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b  , (void*)&rEst);
131a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
131b0 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
131c0 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
131d0 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76  STAT_EXPLAIN, (v
131e0 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b  oid*)&zExplain);
131f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
13200 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
13210 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20  oop %2d: %s\n", 
13220 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  n, zExplain);.  
13230 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20      rEstLoop *= 
13240 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f  rEst;.      raw_
13250 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
13260 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ,.          "   
13270 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c        nLoop=%-8l
13280 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65  ld nRow=%-8lld e
13290 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74  stRow=%-8lld est
132a0 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22  Row/Loop=%-8g\n"
132b0 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f  ,.          nLoo
132c0 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69  p, nVisit, (sqli
132d0 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c  te3_int64)(rEstL
132e0 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20  oop+0.5), rEst. 
132f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13300 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  }.  raw_printf(p
13310 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64  ------\n");.#end
13340 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  if.}../*.** Para
13350 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f  meter azArray po
13360 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74  ints to a zero-t
13370 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20  erminated array 
13380 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72  of strings. zStr
13390 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
133a0 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69  single nul-termi
133b0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65  nated string. Re
133c0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
133d0 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61   zStr.** is equa
133e0 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  l, according to 
133f0 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79  strcmp(), to any
13400 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20   of the strings 
13410 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
13420 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
13430 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
13440 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72  ic int str_in_ar
13450 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ray(const char *
13460 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
13470 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69   **azArray){.  i
13480 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
13490 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b   azArray[i]; i++
134a0 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
134b0 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72  rcmp(zStr, azArr
134c0 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ay[i]) ) return 
134d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
134e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  0;.}../*.** If c
134f0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
13500 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74  t pSql appears t
13510 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20  o be an EXPLAIN 
13520 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63  statement, alloc
13530 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  ate.** and popul
13540 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61  ate the ShellSta
13550 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  te.aiIndent[] ar
13560 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ray with the num
13570 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73  ber of.** spaces
13580 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f   each opcode sho
13590 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20  uld be indented 
135a0 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74  before it is out
135b0 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  put..**.** The i
135c0 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61  ndenting rules a
135d0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  re:.**.**     * 
135e0 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c  For each "Next",
135f0 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22   "Prev", "VNext"
13600 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74   or "VPrev" inst
13610 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a  ruction, indent.
13620 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63  **       all opc
13630 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  odes that occur 
13640 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a  between the p2 j
13650 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
13660 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a  and the opcode.*
13670 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62  *       itself b
13680 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a  y 2 spaces..**.*
13690 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68  *     * For each
136a0 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20   "Goto", if the 
136b0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
136c0 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74   is earlier in t
136d0 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20  he program.**   
136e0 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20      and ends on 
136f0 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20  one of:.**      
13700 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47      Yield  SeekG
13710 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65  t  SeekLt  RowSe
13720 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a  tRead  Rewind.**
13730 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65         or if the
13740 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
13750 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20   one instead of 
13760 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74  zero,.**       t
13770 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f  hen indent all o
13780 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74  pcodes between t
13790 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72  he earlier instr
137a0 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  uction.**       
137b0 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20  and "Goto" by 2 
137c0 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
137d0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
137e0 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c  ata_prepare(Shel
137f0 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74  lState *p, sqlit
13800 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a  e3_stmt *pSql){.
13810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
13820 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
13830 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66    /* The text of
13840 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
13850 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
13860 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
13870 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13880 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  to check if this
13890 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a   is an EXPLAIN *
138a0 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64  /.  int *abYield
138b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
138c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
138d0 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64  p is an OP_Yield
138e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
138f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13900 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
13910 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69  ed size of p->ai
13920 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c  Indent[], abYiel
13930 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20  d */.  int iOp; 
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13950 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13960 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  of operation in 
13970 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  p->aiIndent[] */
13980 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
13990 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65  azNext[] = { "Ne
139a0 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50  xt", "Prev", "VP
139b0 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22  rev", "VNext", "
139c0 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20 7d  SorterNext", 0 }
139d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
139e0 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
139f0 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
13a00 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
13a10 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
13a40 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
13a50 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
13a60 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
13a70 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
13a80 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
13a90 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
13aa0 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
13ab0 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
13ac0 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
13ad0 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
13ae0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
13af0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21  umn_count(pSql)!
13b00 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  =8 ){.    p->cMo
13b10 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13b20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
13b30 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
13b40 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  ql(pSql);.  if( 
13b50 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
13b60 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20  ;.  for(z=zSql; 
13b70 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27  *z==' ' || *z=='
13b80 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20  \t' || *z=='\n' 
13b90 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a  || *z=='\f' || *
13ba0 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20  z=='\r'; z++);. 
13bb0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
13bc0 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69  nicmp(z, "explai
13bd0 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d  n", 7) ){.    p-
13be0 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
13bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
13c00 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  }..  for(iOp=0; 
13c10 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
13c20 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
13c30 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
13c40 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
13c50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13c60 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
13c70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13c80 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
13c90 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
13ca0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
13cb0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
13cc0 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
13cd0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
13ce0 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
13cf0 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
13d00 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
13d10 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
13d20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
13d30 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
13d40 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
13d50 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
13d60 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
13d70 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
13d80 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
13d90 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
13da0 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
13db0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
13dc0 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
13dd0 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
13de0 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
13df0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
13e00 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
13e10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
13e20 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
13e30 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
13e40 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
13e50 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
13e60 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
13e70 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
13e80 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
13e90 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66  lloc ){.      if
13ea0 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iOp==0 ){.    
13eb0 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65      /* Do furthe
13ec0 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68  r verfication th
13ed0 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61  at this is expla
13ee0 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72  in output.  Abor
13ef0 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t if.        ** 
13f00 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20  it is not */.   
13f10 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
13f20 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43  t char *explainC
13f30 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ols[] = {.      
13f40 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
13f50 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
13f60 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
13f70 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d  p5", "comment" }
13f80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a  ;.        int jj
13f90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  ;.        for(jj
13fa0 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65  =0; jj<ArraySize
13fb0 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a  (explainCols); j
13fc0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
13fd0 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
13fe0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
13ff0 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43  Sql,jj),explainC
14000 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20  ols[jj])!=0 ){. 
14010 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d             p->cM
14020 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
14030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14040 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
14050 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14060 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
14070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14080 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  }.      nAlloc +
14090 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 100;.      p->
140a0 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a  aiIndent = (int*
140b0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
140c0 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  64(p->aiIndent, 
140d0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
140e0 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t));.      if( p
140f0 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20  ->aiIndent==0 ) 
14100 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
14110 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62 59  ory();.      abY
14120 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c  ield = (int*)sql
14130 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61  ite3_realloc64(a
14140 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73  bYield, nAlloc*s
14150 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
14160 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d 3d     if( abYield==
14170 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
14180 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
14190 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70  .    abYield[iOp
141a0 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  ] = str_in_array
141b0 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a  (zOp, azYield);.
141c0 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b      p->aiIndent[
141d0 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  iOp] = 0;.    p-
141e0 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31  >nIndent = iOp+1
141f0 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69  ;..    if( str_i
14200 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e  n_array(zOp, azN
14210 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  ext) ){.      fo
14220 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
14230 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
14240 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
14250 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
14260 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74  array(zOp, azGot
14270 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49  o) && p2op<p->nI
14280 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61  ndent.     && (a
14290 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20  bYield[p2op] || 
142a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
142b0 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20  nt(pSql, 2)).   
142c0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
142d0 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
142e0 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
142f0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 2;.    }.  }
14300 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ..  p->iIndent =
14310 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
14320 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73  ee(abYield);.  s
14330 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
14340 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
14350 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f  e the array allo
14360 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e  cated by explain
14370 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e  _data_prepare().
14380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14390 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
143a0 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ete(ShellState *
143b0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
143c0 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
143d0 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
143e0 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
143f0 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
14400 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
14410 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73   Disable and res
14420 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65  tore .wheretrace
14430 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63   and .selecttrac
14440 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23  e settings..*/.#
14450 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14460 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14470 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14480 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65  E_SELECTTRACE).e
14490 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
144a0 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74  3SelectTrace;.st
144b0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65  atic int savedSe
144c0 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
144d0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
144e0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
144f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14500 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
14510 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
14520 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73  te3WhereTrace;.s
14530 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57  tatic int savedW
14540 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
14550 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  f.static void di
14560 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
14570 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14580 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14590 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
145a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
145b0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
145c0 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
145d0 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  e = sqlite3Selec
145e0 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  tTrace;.  sqlite
145f0 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30  3SelectTrace = 0
14600 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
14610 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
14620 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
14630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
14640 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57  ETRACE).  savedW
14650 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69  hereTrace = sqli
14660 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
14670 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
14680 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  ce = 0;.#endif.}
14690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
146a0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
146b0 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
146c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
146d0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
146e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
146f0 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
14700 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
14710 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74  ce = savedSelect
14720 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
14730 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14740 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
14750 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
14760 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
14770 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14780 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61   = savedWhereTra
14790 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ce;.#endif.}../*
147a0 20 43 72 65 61 74 65 20 74 68 65 20 54 45 4d 50   Create the TEMP
147b0 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 73   table used to s
147c0 74 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20 62  tore parameter b
147d0 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74 69  indings */.stati
147e0 63 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62 6c  c void bind_tabl
147f0 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61 74  e_init(ShellStat
14800 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72 53  e *p){.  int wrS
14810 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71 6c  chema = 0;.  sql
14820 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
14830 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  ->db, SQLITE_DBC
14840 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f 53  ONFIG_WRITABLE_S
14850 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53 63  CHEMA, -1, &wrSc
14860 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
14870 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62  _db_config(p->db
14880 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
14890 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d  G_WRITABLE_SCHEM
148a0 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 1, 0);.  sqli
148b0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
148c0 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
148d0 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
148e0 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72 61  temp.sqlite_para
148f0 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20 22  meters(\n".    "
14900 20 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41    key TEXT PRIMA
14910 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 22  RY KEY,\n".    "
14920 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a 20    value ANY\n". 
14930 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52 4f     ") WITHOUT RO
14940 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30 2c  WID;",.    0, 0,
14950 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64   0);.  sqlite3_d
14960 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
14970 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
14980 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c  WRITABLE_SCHEMA,
14990 20 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a 7d   wrSchema, 0);.}
149a0 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61 72  ../*.** Bind par
149b0 61 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72 65  ameters on a pre
149c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
149d0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
149e0 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74 61   bindings are ta
149f0 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50 20  ken from a TEMP 
14a00 74 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f 72  table of the for
14a10 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  m:.**.**    CREA
14a20 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71  TE TEMP TABLE sq
14a30 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28  lite_parameters(
14a40 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52 59  key TEXT PRIMARY
14a50 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a 20   KEY, value).** 
14a60 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44     WITHOUT ROWID
14a70 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64 69  ;.**.** No bindi
14a80 6e 67 73 20 6f 63 63 75 72 20 69 66 20 74 68 69  ngs occur if thi
14a90 73 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  s table does not
14aa0 20 65 78 69 73 74 2e 20 20 54 68 65 20 73 70 65   exist.  The spe
14ab0 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 20 27  cial character '
14ac0 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65  $'.** is include
14ad0 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e  d in the table n
14ae0 61 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65 76  ame to help prev
14af0 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ent collisions w
14b00 69 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c 65  ith actual table
14b10 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  s..** The table 
14b20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 54  must be in the T
14b30 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 73  EMP schema..*/.s
14b40 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64 5f  tatic void bind_
14b50 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53 68  prepared_stmt(Sh
14b60 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
14b70 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14b80 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61 72  tmt){.  int nVar
14b90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
14ba0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
14bb0 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20 20  tmt *pQ = 0;..  
14bc0 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
14bd0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
14be0 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  unt(pStmt);.  if
14bf0 28 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74 75  ( nVar==0 ) retu
14c00 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20  rn;  /* Nothing 
14c10 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20 73  to do */.  if( s
14c20 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
14c30 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41 72  umn_metadata(pAr
14c40 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20 22  g->db, "TEMP", "
14c50 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14c60 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20 30          "key", 0
14c90 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d 53  , 0, 0, 0, 0)!=S
14ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14cb0 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61 6d  return; /* Param
14cc0 65 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73 20  eter table does 
14cd0 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 7d  not exist */.  }
14ce0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14cf0 70 72 65 70 61 72 65 5f 76 32 28 70 41 72 67 2d  prepare_v2(pArg-
14d00 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
14d10 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
14d20 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61  M temp.sqlite_pa
14d30 72 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20 20  rameters".      
14d40 20 20 20 20 22 20 57 48 45 52 45 20 6b 65 79 3d      " WHERE key=
14d50 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30 29  ?1", -1, &pQ, 0)
14d60 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70 51  ;.  if( rc || pQ
14d70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14d80 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
14d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
14da0 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 63   zNum[30];.    c
14db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
14dc0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14dd0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
14de0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tmt, i);.    if(
14df0 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zVar==0 ){.    
14e00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14e10 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2c  tf(sizeof(zNum),
14e20 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a 20  zNum,"?%d",i);. 
14e30 20 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75 6d       zVar = zNum
14e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e50 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 51  te3_bind_text(pQ
14e60 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20 53  , 1, zVar, -1, S
14e70 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14e80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
14e90 74 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45 5f  tep(pQ)==SQLITE_
14ea0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ROW ){.      sql
14eb0 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
14ec0 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74 65  pStmt, i, sqlite
14ed0 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
14ee0 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Q, 0));.    }els
14ef0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
14f00 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
14f10 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
14f20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 51  sqlite3_reset(pQ
14f30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14f40 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a 7d  _finalize(pQ);.}
14f50 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72  ../*.** Run a pr
14f60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14f70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14f80 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
14f90 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  mt(.  ShellState
14fa0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
14fd0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
14fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
14ff0 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20  t *pStmt        
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e        /* Statmen
15020 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20  t to run */.){. 
15030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70   int rc;..  /* p
15040 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
15050 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
15060 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
15070 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75    ** have a resu
15080 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e  lt set or not an
15090 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73  d how wide it is
150a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
150b0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
150c0 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61  );.  /* if we ha
150d0 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
150e0 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .. */.  if( SQLI
150f0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
15100 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
15110 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61  space for col na
15120 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74  me ptr, value pt
15130 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20  r, and type */. 
15140 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
15150 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
15160 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76  nt(pStmt);.    v
15170 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c  oid *pData = sql
15180 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a  ite3_malloc64(3*
15190 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73  nCol*sizeof(cons
151a0 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20  t char*) + 1);. 
151b0 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b     if( !pData ){
151c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
151d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
151e0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
151f0 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72  **azCols = (char
15200 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20   **)pData;      
15210 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75  /* Names of resu
15220 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
15230 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c      char **azVal
15240 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c  s = &azCols[nCol
15250 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ];       /* Resu
15260 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
15270 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74   *aiTypes = (int
15280 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d   *)&azVals[nCol]
15290 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65  ; /* Result type
152a0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
152b0 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , x;.      asser
152c0 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d  t(sizeof(int) <=
152d0 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29   sizeof(char *))
152e0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20  ;.      /* save 
152f0 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75  off ptrs to colu
15300 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
15310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15320 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
15330 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68   azCols[i] = (ch
15340 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
15350 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
15360 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
15370 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a    do{.        /*
15380 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74   extract the dat
15390 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73  a and data types
153a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
153b0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
153c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54  ){.          aiT
153d0 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71  ypes[i] = x = sq
153e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
153f0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
15400 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51         if( x==SQ
15410 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72  LITE_BLOB && pAr
15420 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65  g && pArg->cMode
15430 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b  ==MODE_Insert ){
15440 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56  .            azV
15450 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20  als[i] = "";.   
15460 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15470 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73            azVals
15480 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  [i] = (char*)sql
15490 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
154a0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
154b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
154c0 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d    if( !azVals[i]
154d0 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21   && (aiTypes[i]!
154e0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
154f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15500 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15510 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15520 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a  k; /* from for *
15530 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  /.          }.  
15540 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66        } /* end f
15550 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  or */..        /
15560 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79  * if data and ty
15570 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75  pes extracted su
15580 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f  ccessfully... */
15590 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
155a0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
155b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61  .          /* ca
155c0 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  ll the supplied 
155d0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
155e0 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74  e result row dat
155f0 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  a */.          i
15600 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  f( shell_callbac
15610 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a  k(pArg, nCol, az
15620 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69  Vals, azCols, ai
15630 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20  Types) ){.      
15640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15650 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20  E_ABORT;.       
15660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15680 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
15690 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
156a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68      }.      } wh
156b0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20  ile( SQLITE_ROW 
156c0 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73  == rc );.      s
156d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
156e0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  a);.    }.  }.}.
156f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15700 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15710 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  E./*.** This fun
15720 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15730 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69  to process SQL i
15740 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
15750 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  hell command.** 
15760 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49  was ".expert". I
15770 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c  t passes the SQL
15780 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
15790 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79  rgument directly
157a0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   to.** the sqlit
157b0 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e  e3expert object.
157c0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
157d0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
157e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
157f0 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
15800 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e  e error.** code.
15810 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28   In this case, (
15820 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73  *pzErr) may be s
15830 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
15840 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15850 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68  ng.** an English
15860 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
15870 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
15880 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15890 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
158a0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
158b0 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
158c0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
158d0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
158e0 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64  c int expertHand
158f0 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74  leSQL(.  ShellSt
15900 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20  ate *pState, .  
15910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
15920 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
15930 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  r.){.  assert( p
15940 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
15950 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72  xpert );.  asser
15960 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a  t( pzErr==0 || *
15970 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65  pzErr==0 );.  re
15980 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70  turn sqlite3_exp
15990 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e  ert_sql(pState->
159a0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20  expert.pExpert, 
159b0 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a  zSql, pzErr);.}.
159c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
159d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65  tion is called e
159e0 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c  ither to silentl
159f0 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f  y clean up the o
15a00 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64  bject.** created
15a10 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74   by the ".expert
15a20 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43  " command (if bC
15a30 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f  ancel==1), or to
15a40 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20   generate a .** 
15a50 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61  report from it a
15a60 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74  nd then clean it
15a70 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d   up (if bCancel=
15a80 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  =0)..**.** If su
15a90 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
15aa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15ab0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
15ac0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
15ad0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
15ae0 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
15af0 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
15b00 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
15b10 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
15b20 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
15b30 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
15b40 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
15b50 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
15b60 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
15b70 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
15b80 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
15b90 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
15ba0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
15bb0 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53  Finish(.  ShellS
15bc0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20  tate *pState,.  
15bd0 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63  int bCancel,.  c
15be0 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
15bf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15c00 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78  _OK;.  sqlite3ex
15c10 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65  pert *p = pState
15c20 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15c30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
15c40 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63  .  assert( bCanc
15c50 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c  el || pzErr==0 |
15c60 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  | *pzErr==0 );. 
15c70 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20   if( bCancel==0 
15c80 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  ){.    FILE *out
15c90 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a   = pState->out;.
15ca0 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65      int bVerbose
15cb0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
15cc0 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20  t.bVerbose;..   
15cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
15ce0 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20  pert_analyze(p, 
15cf0 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  pzErr);.    if( 
15d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d10 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72  .      int nQuer
15d20 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  y = sqlite3_expe
15d30 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20  rt_count(p);.   
15d40 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
15d50 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
15d60 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15d70 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c  har *zCand = sql
15d80 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
15d90 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45  rt(p,0,EXPERT_RE
15da0 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29  PORT_CANDIDATES)
15db0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
15dc0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61  intf(out, "-- Ca
15dd0 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d  ndidates -------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20  ------\n");.    
15e00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
15e10 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e  ut, "%s\n", zCan
15e20 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
15e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75    for(i=0; i<nQu
15e40 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ery; i++){.     
15e50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15e60 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Sql = sqlite3_ex
15e70 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
15e80 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
15e90 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  SQL);.        co
15ea0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
15eb0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15ec0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15ed0 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58  ERT_REPORT_INDEX
15ee0 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ES);.        con
15ef0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
15f00 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15f10 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15f20 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b  RT_REPORT_PLAN);
15f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64  .        if( zId
15f40 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28  x==0 ) zIdx = "(
15f50 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c  no new indexes)\
15f60 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n";.        if( 
15f70 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
15f80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15f90 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20  (out, "-- Query 
15fa0 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  %d -------------
15fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fc0 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20  ---\n",i+1);.   
15fd0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15fe0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c  f(out, "%s\n\n",
15ff0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
16000 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
16010 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
16020 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , zIdx);.       
16030 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
16040 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a   "%s\n", zEQP);.
16050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16060 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65  }.  sqlite3_expe
16070 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20  rt_destroy(p);. 
16080 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
16090 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72  pExpert = 0;.  r
160a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
160b0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
160c0 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64  n of ".expert" d
160d0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
160e0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
160f0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
16100 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
16110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16120 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
16130 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
16140 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16160 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
16170 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
16180 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
16190 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
161c0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
161d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
161e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
161f0 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
16200 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61  int i;.  int iSa
16210 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  mple = 0;..  ass
16220 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70  ert( pState->exp
16230 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29  ert.pExpert==0 )
16240 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61  ;.  memset(&pSta
16250 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73  te->expert, 0, s
16260 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f  izeof(ExpertInfo
16270 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ));..  for(i=1; 
16280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16290 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
162a0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41     char *z = azA
162b0 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rg[i];.    int n
162c0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
162d0 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
162e0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20   ) z++;.    n = 
162f0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
16300 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
16310 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72  strncmp(z, "-ver
16320 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  bose", n) ){.   
16330 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
16340 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  t.bVerbose = 1;.
16350 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
16360 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74  f( n>=2 && 0==st
16370 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c  rncmp(z, "-sampl
16380 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20  e", n) ){.      
16390 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20  if( i==(nArg-1) 
163a0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
163b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
163c0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
163d0 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e  n argument: %s\n
163e0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
163f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16410 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d         iSample =
16420 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
16430 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a  ue(azArg[++i]);.
16440 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d          if( iSam
16450 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65  ple<0 || iSample
16460 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
16470 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
16480 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20  err, "value out 
16490 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c  of range: %s\n",
164a0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
164b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
164c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
164d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
164e0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
164f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
16500 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
16510 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ion: %s\n", z);.
16520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16530 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
16540 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
16550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16560 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
16570 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  xpert = sqlite3_
16580 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74  expert_new(pStat
16590 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20  e->db, &zErr);. 
165a0 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65     if( pState->e
165b0 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
165c0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
165d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
165e0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77  lite3_expert_new
165f0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
16600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16610 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
16620 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
16630 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28  3_expert_config(
16640 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74  .          pStat
16650 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
16660 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47  t, EXPERT_CONFIG
16670 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65  _SAMPLE, iSample
16680 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
16690 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
166a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
166b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
166c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
166d0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
166e0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
166f0 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
16700 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20  .  Print.** any 
16710 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
16720 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
16730 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
16740 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65  e.** set via the
16750 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
16760 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
16770 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74  s very similar t
16780 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  o SQLite's built
16790 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63  -in sqlite3_exec
167a0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ().** function e
167b0 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
167c0 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
167d0 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ent callback.** 
167e0 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74  and callback dat
167f0 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  a argument..*/.s
16800 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
16810 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61  exec(.  ShellSta
16820 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16850 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
16860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
16870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
16890 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64   to be evaluated
168a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
168b0 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
168e0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
168f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16900 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  pStmt = NULL;   
16910 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
16920 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
16930 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16940 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
16950 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
16960 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63  /.  int rc2;.  c
16970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
16980 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  over;          /
16990 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63  * Tail of unproc
169a0 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73  essed SQL */.  s
169b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72  qlite3 *db = pAr
169c0 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a  g->db;..  if( pz
169d0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70  ErrMsg ){.    *p
169e0 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a  zErrMsg = NULL;.
169f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16a00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16a10 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67  TABLE.  if( pArg
16a20 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16a30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70   ){.    rc = exp
16a40 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72  ertHandleSQL(pAr
16a50 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73  g, zSql, pzErrMs
16a60 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  g);.    return e
16a70 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67  xpertFinish(pArg
16a80 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  , (rc!=SQLITE_OK
16a90 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ), pzErrMsg);.  
16aa0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
16ab0 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53  e( zSql[0] && (S
16ac0 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20  QLITE_OK == rc) 
16ad0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
16ae0 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53  nst char *zStmtS
16af0 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ql;.    rc = sql
16b00 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16b10 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
16b20 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72  Stmt, &zLeftover
16b30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
16b40 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20  E_OK != rc ){.  
16b50 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67      if( pzErrMsg
16b60 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16b70 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16b80 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16b90 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
16ba0 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b     if( !pStmt ){
16bb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73  .        /* this
16bc0 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63   happens for a c
16bd0 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d  omment or white-
16be0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  space */.       
16bf0 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65   zSql = zLeftove
16c00 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  r;.        while
16c10 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30  ( IsSpace(zSql[0
16c20 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
16c30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74       }.      zSt
16c50 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  mtSql = sqlite3_
16c60 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
16c70 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d    if( zStmtSql==
16c80 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22  0 ) zStmtSql = "
16c90 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ";.      while( 
16ca0 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c  IsSpace(zStmtSql
16cb0 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b  [0]) ) zStmtSql+
16cc0 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76  +;..      /* sav
16cd0 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72  e off the prepar
16ce0 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64  ed statment hand
16cf0 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77  le and reset row
16d00 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   count */.      
16d10 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
16d20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
16d30 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  = pStmt;.       
16d40 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a   pArg->cnt = 0;.
16d50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16d60 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73  * echo the sql s
16d70 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f  tatement if echo
16d80 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16d90 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61   pArg && ShellHa
16da0 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c  sFlag(pArg, SHFL
16db0 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20  G_Echo) ){.     
16dc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
16dd0 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  Arg->out, "%s\n"
16de0 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74  , zStmtSql ? zSt
16df0 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20  mtSql : zSql);. 
16e00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16e10 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49   Show the EXPLAI
16e20 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20  N QUERY PLAN if 
16e30 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20  .eqp is on */.  
16e40 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
16e50 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26  pArg->autoEQP &&
16e60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73   sqlite3_stmt_is
16e70 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d  explain(pStmt)==
16e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
16e90 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
16ea0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ain;.        cha
16eb0 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20  r *zEQP;.       
16ec0 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20   int triggerEQP 
16ed0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73  = 0;.        dis
16ee0 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
16ef0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
16f00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16f10 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16f20 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
16f30 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65  EQP, -1, &trigge
16f40 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69  rEQP);.        i
16f50 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
16f60 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
16f70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
16f80 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
16f90 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
16fa0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
16fb0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
16fc0 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20   }.        zEQP 
16fd0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16fe0 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  f("EXPLAIN QUERY
16ff0 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74   PLAN %s", zStmt
17000 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Sql);.        rc
17010 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
17020 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
17030 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
17040 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17060 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
17070 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
17080 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
17090 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
170a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
170b0 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74  EQPLine = (const
170c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
170d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
170e0 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20  ain,3);.        
170f0 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d      int iEqpId =
17100 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17110 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29  int(pExplain, 0)
17120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
17130 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71  t iParentId = sq
17140 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
17150 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20  (pExplain, 1);. 
17160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
17170 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20  EQPLine[0]=='-' 
17180 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72  ) eqp_render(pAr
17190 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
171a0 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c  eqp_append(pArg,
171b0 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74   iEqpId, iParent
171c0 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20  Id, zEQPLine);. 
171d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
171e0 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28       eqp_render(
171f0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  pArg);.        }
17200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17210 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
17220 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  in);.        sql
17230 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
17240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
17250 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
17260 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20  EQP_full ){.    
17270 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f        /* Also do
17280 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20   an EXPLAIN for 
17290 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65  ".eqp full" mode
172a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
172b0 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  QP = sqlite3_mpr
172c0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73  intf("EXPLAIN %s
172d0 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20  ", zStmtSql);.  
172e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
172f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
17300 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
17310 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
17320 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17340 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
17350 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
17360 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  in;.            
17370 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
17380 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c  pare(pArg, pExpl
17390 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
173a0 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
173b0 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c  stmt(pArg, pExpl
173c0 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
173d0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
173e0 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20  elete(pArg);.   
173f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17400 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
17410 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
17420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17430 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
17440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17450 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
17460 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
17470 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d  r && triggerEQP=
17480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17490 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
174a0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
174b0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
174c0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 0, 0);.      
174d0 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65      /* Reprepare
174e0 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65   pStmt before re
174f0 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d  activing trace m
17500 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  odes */.        
17510 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17520 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
17530 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65       sqlite3_pre
17540 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
17550 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
17560 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17570 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74  pArg ) pArg->pSt
17580 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
17590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
175a0 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
175b0 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
175c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41   }..      if( pA
175d0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
175e0 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67  rg->cMode = pArg
175f0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
17600 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78  if( pArg->autoEx
17610 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
17620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
17630 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53  tmt_isexplain(pS
17640 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  tmt)==1 ){.     
17650 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17660 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
17670 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
17680 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
17690 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c  ite3_stmt_isexpl
176a0 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b  ain(pStmt)==2 ){
176b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72  .            pAr
176c0 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
176d0 45 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  EQP;.          }
176e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
176f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68      /* If the sh
17700 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ell is currently
17710 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d   in ".explain" m
17720 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20  ode, gather the 
17730 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a  extra.        **
17740 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74   data required t
17750 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f  o add indents to
17760 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20   the output.*/. 
17770 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
17780 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  >cMode==MODE_Exp
17790 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
177a0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
177b0 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74  repare(pArg, pSt
177c0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mt);.        }. 
177d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69       }..      bi
177e0 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  nd_prepared_stmt
177f0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
17800 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
17810 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
17820 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
17830 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
17840 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70  pArg);.      eqp
17850 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a  _render(pArg);..
17860 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
17870 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
17880 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
17890 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
178a0 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
178b0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
178c0 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
178d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
178e0 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
178f0 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
17900 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
17910 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
17920 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
17930 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
17940 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
17950 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17960 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
17970 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
17980 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
17990 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
179a0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
179b0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
179c0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
179d0 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
179e0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
179f0 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
17a00 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
17a10 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
17a20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17a30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
17a40 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
17a50 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
17a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
17a80 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
17a90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
17aa0 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
17ab0 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
17ac0 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
17ad0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
17ae0 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
17af0 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
17b00 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
17b10 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
17b20 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
17b30 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
17b40 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
17b50 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
17b60 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
17b70 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
17b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17b90 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
17ba0 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
17bb0 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
17bc0 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
17bd0 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
17be0 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
17bf0 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
17c00 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
17c10 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
17c20 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
17c30 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
17c40 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
17c50 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
17c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
17c70 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
17c80 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
17c90 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
17ca0 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
17cb0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
17cc0 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
17cd0 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
17ce0 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
17cf0 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
17d00 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
17d10 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
17d20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
17d30 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
17d40 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
17d50 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
17d60 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
17d70 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
17d80 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
17d90 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
17da0 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
17db0 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
17dc0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
17dd0 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
17de0 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
17df0 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
17e00 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
17e10 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
17e20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
17e30 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
17e40 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
17e50 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
17e60 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
17e70 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
17e80 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
17e90 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
17ea0 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
17eb0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
17ec0 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
17ed0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
17ee0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
17ef0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
17f00 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
17f10 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
17f20 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
17f30 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
17f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
17f50 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
17f60 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
17f70 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
17f80 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
17f90 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
17fa0 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
17fb0 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
17fc0 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
17fd0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
17fe0 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
17ff0 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
18000 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18010 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
18020 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
18030 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18040 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
18050 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
18060 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
18070 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
18080 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18090 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
180a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
180b0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
180c0 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
180d0 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
180e0 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
180f0 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
18100 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
18110 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
18120 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
18130 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
18140 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
18150 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
18160 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
18170 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
18180 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18190 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
181a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
181b0 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
181c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
181d0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
181e0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
181f0 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
18200 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18210 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
18220 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
18230 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
18240 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
18260 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
18270 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
18280 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
18290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
182a0 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
182b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
182c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
182d0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
182e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
182f0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
18300 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
18310 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
18320 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
18330 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
18340 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
18350 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
18360 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
18370 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
18380 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
18390 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
183a0 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
183b0 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
183c0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
183d0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
183e0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
183f0 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
18400 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
18410 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
18420 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
18430 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
18440 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
18450 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
18460 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
18470 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
18480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
18490 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
184a0 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
184b0 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
184c0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
184d0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
184e0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
184f0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
18500 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
18510 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
18520 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
18530 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
18540 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
18550 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
18560 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
18570 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
18580 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
18590 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
185a0 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
185b0 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
185c0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
185d0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
185e0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
185f0 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
18600 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
18610 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
18620 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
18630 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
18640 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
18650 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
18660 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
18670 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
18680 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
18690 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
186c0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
186d0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
186e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
186f0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
18700 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
18710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18720 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
18730 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
18740 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
18750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18760 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
18770 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
18780 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
18790 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
187a0 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
187b0 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
187c0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
187d0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
187e0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
187f0 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
18800 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
18810 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
18820 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
18830 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
18840 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
18850 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
18860 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
18870 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
18880 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18890 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
188a0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
188b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
188c0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
188d0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
188e0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
188f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18900 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
18910 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
18920 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
18930 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
18940 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
18950 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
18960 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
18970 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
18980 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
18990 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
189a0 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
189b0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
189c0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
189d0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
189e0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
189f0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18a00 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
18a10 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
18a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18a30 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
18a40 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
18a50 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
18a60 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
18a70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18a80 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
18a90 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
18aa0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ac0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
18ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
18ae0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
18af0 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
18b00 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
18b10 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
18b20 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
18b30 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
18b40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18b50 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
18b60 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
18b70 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
18b80 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
18b90 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
18ba0 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
18bb0 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
18bc0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
18bd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18be0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18bf0 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
18c00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18c10 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
18c20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
18c30 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
18c40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
18c50 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
18c60 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
18c70 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18c80 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
18c90 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
18ca0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
18cb0 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
18cc0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
18cd0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
18ce0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
18cf0 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
18d00 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
18d10 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
18d20 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
18d30 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
18d40 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
18d50 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
18d60 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
18d70 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
18d80 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
18d90 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
18da0 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
18db0 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
18dc0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
18dd0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
18de0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
18df0 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
18e00 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
18e10 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
18e20 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
18e30 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
18e40 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
18e50 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
18e60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18e70 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
18e80 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
18e90 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
18ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
18eb0 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
18ec0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
18ed0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
18ee0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
18ef0 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
18f00 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
18f10 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
18f20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
18f30 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
18f40 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
18f50 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18f60 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
18f70 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
18f80 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
18f90 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
18fa0 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
18fb0 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
18fc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
18fd0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
18fe0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
18ff0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
19000 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
19010 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
19020 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
19040 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
19050 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
19060 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
19070 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
19080 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
19090 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
190a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
190b0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
190c0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
190d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
190e0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
190f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
19100 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
19110 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
19120 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
19130 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
19140 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
19150 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
19160 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
19170 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
19180 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
19190 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
191a0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
191b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
191c0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
191d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
191e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
191f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
19200 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
19210 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
19220 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
19230 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
19240 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
19250 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
19260 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
19270 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
19280 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
19290 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
192a0 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
192b0 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
192c0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
192d0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
192e0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
192f0 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
19300 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
19310 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19320 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
19330 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
19340 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
19350 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
19360 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
19370 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
19380 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
19390 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
193a0 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
193b0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
193c0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
193d0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
193e0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
193f0 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
19400 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
19410 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
19420 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
19430 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
19440 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
19450 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
19460 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
19470 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
19480 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
19490 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
194a0 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
194b0 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
194c0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
194d0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
194e0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
194f0 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
19500 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
19510 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
19520 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
19530 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19540 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
19550 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19560 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
19570 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
19580 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
19590 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
195a0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
195b0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
195c0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
195d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
195e0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
195f0 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
19600 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
19610 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
19620 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
19630 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
19640 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
19650 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19660 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19670 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
19680 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
19690 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
196a0 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
196b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
196c0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
196d0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
196e0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
196f0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
19700 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
19710 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
19720 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
19730 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
19740 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
19750 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
19760 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
19770 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19780 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
19790 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
197a0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
197b0 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
197c0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
197d0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
197e0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
197f0 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
19800 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
19810 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
19820 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
19830 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
19840 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
19850 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
19860 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
19870 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
19880 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
19890 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
198a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
198b0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
198c0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
198d0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
198e0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
198f0 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
19900 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
19910 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
19920 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
19930 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
19940 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
19950 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
19960 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
19970 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
19980 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
19990 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
199a0 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
199b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
199c0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
199d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
199e0 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
199f0 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
19a00 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
19a10 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
19a20 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
19a30 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
19a40 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
19a50 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
19a60 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
19a70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19a80 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
19a90 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
19aa0 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
19ab0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
19ac0 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
19ad0 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
19ae0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
19af0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
19b00 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
19b10 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
19b20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
19b30 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
19b40 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19b50 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
19b60 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
19b70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19b80 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
19b90 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
19ba0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
19bb0 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
19bc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
19bd0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
19be0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
19bf0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
19c00 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
19c10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
19c20 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
19c30 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
19c40 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
19c50 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
19c60 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
19c70 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
19c80 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
19c90 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
19ca0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
19cb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19cc0 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
19cd0 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
19ce0 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
19cf0 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
19d00 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19d10 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
19d20 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
19d30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
19d40 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
19d50 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
19d60 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
19d70 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19da0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
19db0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19dc0 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
19dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19de0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
19df0 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65   of help message
19e00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c  s..**.** The hel
19e10 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  p text for each 
19e20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61  individual comma
19e30 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  nd begins with a
19e40 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74   line that start
19e50 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20  s.** with ".".  
19e60 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73  Subsequent lines
19e70 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61   are supplimenta
19e80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
19e90 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
19ea0 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
19eb0 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68  paces between th
19ec0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d  e end of the com
19ed0 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mand and the.** 
19ee0 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73  start of the des
19ef0 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74  cription of what
19f00 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f   that command do
19f10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
19f20 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c  nst char *(azHel
19f30 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66  p[]) = {.#if def
19f40 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
19f50 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
19f60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19f70 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
19f80 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
19f90 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
19fa0 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20  SQL archives",. 
19fb0 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e   "   Each comman
19fc0 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  d must have exac
19fd0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
19fe0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73  ollowing options
19ff0 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20  :",.  "     -c, 
1a000 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20  --create        
1a010 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
1a020 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20  new archive",.  
1a030 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61  "     -u, --upda
1a040 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
1a050 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70   Add files or up
1a060 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20  date files with 
1a070 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c 0a  changed mtime",.
1a080 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e    "     -i, --in
1a090 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  sert            
1a0a0 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20 61     Like -u but a
1a0b0 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20 69  lways add even i
1a0c0 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67 65  f mtime unchange
1a0d0 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20  d",.  "     -t, 
1a0e0 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  --list          
1a0f0 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74         List cont
1a100 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 22  ents of archive"
1a110 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d  ,.  "     -x, --
1a120 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20  extract         
1a130 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c       Extract fil
1a140 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22  es from archive"
1a150 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c  ,.  "   Optional
1a160 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20   arguments:",.  
1a170 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62  "     -v, --verb
1a180 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1a190 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
1a1a0 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
1a1b0 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20  ocessed",.  "   
1a1c0 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c    -f FILE, --fil
1a1d0 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65  e FILE       Ope
1a1e0 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20  rate on archive 
1a1f0 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73  FILE (default is
1a200 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20   current db)",. 
1a210 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20   "     -a FILE, 
1a220 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20  --append FILE   
1a230 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c    Operate on FIL
1a240 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  E opened using t
1a250 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c  he apndvfs VFS",
1a260 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c  .  "     -C DIR,
1a270 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52   --directory DIR
1a280 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69      Change to di
1a290 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72  rectory DIR to r
1a2a0 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65  ead/extract file
1a2b0 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20  s",.  "     -n, 
1a2c0 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20  --dryrun        
1a2d0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1a2e0 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
1a2f0 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20  ave occurred",. 
1a300 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c   "   Examples:",
1a310 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66  .  "     .ar -cf
1a320 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f   archive.sar foo
1a330 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20 61   bar  # Create a
1a340 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20  rchive.sar from 
1a350 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61  files foo and ba
1a360 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20  r",.  "     .ar 
1a370 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -tf archive.sar 
1a380 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20           # List 
1a390 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69  members of archi
1a3a0 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20  ve.sar",.  "    
1a3b0 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76   .ar -xvf archiv
1a3c0 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23 20  e.sar         # 
1a3d0 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63  Verbosely extrac
1a3e0 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63  t files from arc
1a3f0 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20  hive.sar",.  "  
1a400 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22   See also:",.  "
1a410 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c        http://sql
1a420 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c  ite.org/cli.html
1a430 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73  #sqlar_archive_s
1a440 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a  upport",.#endif.
1a450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a460 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1a470 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46  N.  ".auth ON|OF
1a480 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  F             Sh
1a490 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ow authorizer ca
1a4a0 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66  llbacks",.#endif
1a4b0 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f  .  ".backup ?DB?
1a4c0 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61 63   FILE        Bac
1a4d0 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20  kup DB (default 
1a4e0 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c  \"main\") to FIL
1a4f0 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  E",.  "       --
1a500 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20 20  append          
1a510 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e 64    Use the append
1a520 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20  vfs",.  "       
1a530 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20 20  --async         
1a540 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c      Write to FIL
1a550 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75 72  E without a jour
1a560 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nal and without 
1a570 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61  fsync()",.  ".ba
1a580 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  il on|off       
1a590 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
1a5a0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
1a5b0 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22  r.  Default OFF"
1a5c0 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ,.  ".binary on|
1a5d0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75  off           Tu
1a5e0 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74  rn binary output
1a5f0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66   on or off.  Def
1a600 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63  ault OFF",.  ".c
1a610 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
1a620 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68         Change th
1a630 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
1a640 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59  ory to DIRECTORY
1a650 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f  ",.  ".changes o
1a660 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53  n|off          S
1a670 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  how number of ro
1a680 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51  ws changed by SQ
1a690 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c  L",.  ".check GL
1a6a0 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
1a6b0 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73  Fail if output s
1a6c0 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64  ince .testcase d
1a6d0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a  oes not match",.
1a6e0 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20    ".clone NEWDB 
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e              Clon
1a700 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44  e data into NEWD
1a710 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74  B from the exist
1a720 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
1a730 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20   ".databases    
1a740 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1a750 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
1a760 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
1a770 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f  bases",.  ".dbco
1a780 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20  nfig ?op? ?val? 
1a790 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e      List or chan
1a7a0 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  ge sqlite3_db_co
1a7b0 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c  nfig() options",
1a7c0 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f  .  ".dbinfo ?DB?
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1a7e0 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
1a7f0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
1a800 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75  atabase",.  ".du
1a810 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
1a820 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c        Render all
1a830 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
1a840 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20  t as SQL",.  "  
1a850 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1a860 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72      --preserve-r
1a870 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75  owids      Inclu
1a880 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20  de ROWID values 
1a890 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a  in the output",.
1a8a0 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e    "     --newlin
1a8b0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41  es             A
1a8c0 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e  llow unescaped n
1a8d0 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72  ewline character
1a8e0 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20  s in output",.  
1a8f0 22 20 20 20 54 41 42 4c 45 20 69 73 20 4c 49 4b  "   TABLE is LIK
1a900 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68  E pattern for th
1a910 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75 6d 70  e tables to dump
1a920 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f  ",.  ".echo on|o
1a930 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 54  ff             T
1a940 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f  urn command echo
1a950 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22   on or off",.  "
1a960 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c  .eqp on|off|full
1a970 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c 65 20  |...     Enable 
1a980 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d  or disable autom
1a990 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
1a9a0 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20 20 20  RY PLAN",.  "   
1a9b0 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c 0a 23  Other Modes:",.#
1a9c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a9d0 55 47 0a 20 20 22 20 20 20 20 20 20 74 65 73 74  UG.  "      test
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 53 68 6f 77 20 72 61 77 20 45 58 50 4c 41    Show raw EXPLA
1aa00 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
1aa10 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20 20  tput",.  "      
1aa20 74 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20  trace           
1aa30 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c        Like \"ful
1aa40 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 65 6e 61  l\" but also ena
1aa50 62 6c 65 20 5c 22 50 52 41 47 4d 41 20 76 64 62  ble \"PRAGMA vdb
1aa60 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65 6e 64  e_trace\"",.#end
1aa70 69 66 0a 20 20 22 20 20 20 20 20 20 74 72 69 67  if.  "      trig
1aa80 67 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ger             
1aa90 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20    Like \"full\" 
1aaa0 62 75 74 20 61 6c 73 6f 20 73 68 6f 77 20 74 72  but also show tr
1aab0 69 67 67 65 72 20 62 79 74 65 63 6f 64 65 22 2c  igger bytecode",
1aac0 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20  .  ".excel      
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73               Dis
1aae0 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20  play the output 
1aaf0 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20  of next command 
1ab00 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74  in a spreadsheet
1ab10 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f 44  ",.  ".exit ?COD
1ab20 45 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 45  E?             E
1ab30 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
1ab40 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f 64   with return-cod
1ab50 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70  e CODE",.  ".exp
1ab60 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ert             
1ab70 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41       EXPERIMENTA
1ab80 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78  L. Suggest index
1ab90 65 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64  es for specified
1aba0 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65   queries",./* Be
1abb0 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f  cause explain mo
1abc0 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f  de comes on auto
1abd0 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74  matically now, t
1abe0 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  he ".explain" mo
1abf0 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64  de.** is removed
1ac00 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73   from the help s
1ac10 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74  creen.  It is st
1ac20 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f  ill supported fo
1ac30 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65  r legacy, howeve
1ac40 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e  r */./*".explain
1ac50 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20   ?on|off|auto?  
1ac60 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75   Turn EXPLAIN ou
1ac70 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20  tput mode on or 
1ac80 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61  off or to automa
1ac90 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c  tic",*/.  ".full
1aca0 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74  schema ?--indent
1acb0 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20  ?   Show schema 
1acc0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
1acd0 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74  of sqlite_stat t
1ace0 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64  ables",.  ".head
1acf0 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ers on|off      
1ad00 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79      Turn display
1ad10 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f   of headers on o
1ad20 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70  r off",.  ".help
1ad30 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e   ?-all? ?PATTERN
1ad40 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65  ?   Show help te
1ad50 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c  xt for PATTERN",
1ad60 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45  .  ".import FILE
1ad70 20 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70   TABLE       Imp
1ad80 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49  ort data from FI
1ad90 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a  LE into TABLE",.
1ada0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1adb0 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
1adc0 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e  .  ".imposter IN
1add0 44 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65  DEX TABLE    Cre
1ade0 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ate imposter tab
1adf0 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65  le TABLE on inde
1ae00 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66  x INDEX",.#endif
1ae10 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41  .  ".indexes ?TA
1ae20 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f  BLE?         Sho
1ae30 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78  w names of index
1ae40 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  es",.  "        
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73     If TABLE is s
1ae70 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
1ae80 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22  how indexes for"
1ae90 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1aec0 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20  TABLE using the 
1aed0 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c  LIKE operator.",
1aee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1aef0 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20  NABLE_IOTRACE.  
1af00 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20  ".iotrace FILE  
1af10 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65            Enable
1af20 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20   I/O diagnostic 
1af30 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22  logging to FILE"
1af40 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d  ,.#endif.  ".lim
1af50 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f  it ?LIMIT? ?VAL?
1af60 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20       Display or 
1af70 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
1af80 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49   of an SQLITE_LI
1af90 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f  MIT",.  ".lint O
1afa0 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20  PTIONS          
1afb0 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69    Report potenti
1afc0 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73  al schema issues
1afd0 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  .",.  "     Opti
1afe0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1aff0 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20    fkey-indexes  
1b000 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20     Find missing 
1b010 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65  foreign key inde
1b020 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  xes",.#ifndef SQ
1b030 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1b040 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61  XTENSION.  ".loa
1b050 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20  d FILE ?ENTRY?  
1b060 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74       Load an ext
1b070 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c  ension library",
1b080 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20  .#endif.  ".log 
1b090 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
1b0a0 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
1b0b0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
1b0c0 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
1b0d0 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64  stdout",.  ".mod
1b0e0 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20  e MODE ?TABLE?  
1b0f0 20 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20       Set output 
1b100 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44  mode",.  "   MOD
1b110 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20  E is one of:",. 
1b120 20 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20   "     ascii    
1b130 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c  Columns/rows del
1b140 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61  imited by 0x1F a
1b150 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20  nd 0x1E",.  "   
1b160 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61    csv      Comma
1b170 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
1b180 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75  s",.  "     colu
1b190 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
1b1a0 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
1b1b0 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20   .width)",.  "  
1b1c0 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c     html     HTML
1b1d0 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a   <table> code",.
1b1e0 20 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20    "     insert  
1b1f0 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74   SQL insert stat
1b200 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45  ements for TABLE
1b210 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20  ",.  "     line 
1b220 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65      One value pe
1b230 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20  r line",.  "    
1b240 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
1b250 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22   delimited by \"
1b260 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75  |\"",.  "     qu
1b270 6f 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e  ote    Escape an
1b280 73 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c  swers as for SQL
1b290 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20  ",.  "     tabs 
1b2a0 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65      Tab-separate
1b2b0 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20  d values",.  "  
1b2c0 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20     tcl      TCL 
1b2d0 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a  list elements",.
1b2e0 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54    ".nullvalue ST
1b2f0 52 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20  RING        Use 
1b300 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20  STRING in place 
1b310 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c  of NULL values",
1b320 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78  .  ".once (-e|-x
1b330 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74  |FILE)       Out
1b340 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74  put for the next
1b350 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c   SQL command onl
1b360 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  y to FILE",.  " 
1b370 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69      If FILE begi
1b380 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e  ns with '|' then
1b390 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22   open as a pipe"
1b3a0 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20  ,.  "     Other 
1b3b0 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  options:",.  "  
1b3c0 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b       -e    Invok
1b3d0 65 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64  e system text ed
1b3e0 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20  itor",.  "      
1b3f0 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61   -x    Open in a
1b400 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20   spreadsheet",. 
1b410 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53   ".open ?OPTIONS
1b420 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65  ? ?FILE?   Close
1b430 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
1b440 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49  se and reopen FI
1b450 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74  LE",.  "     Opt
1b460 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1b470 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20     --append     
1b480 20 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73     Use appendvfs
1b490 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62   to append datab
1b4a0 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ase to the end o
1b4b0 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66 20  f FILE",.#ifdef 
1b4c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
1b4d0 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20 20  SERIALIZE.  "   
1b4e0 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69       --deseriali
1b4f0 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d  ze   Load into m
1b500 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c  emory useing sql
1b510 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65  ite3_deserialize
1b520 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  ()",.  "        
1b530 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20 20 20  --hexdb         
1b540 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75 74 20  Load the output 
1b550 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22 20 61  of \"dbtotxt\" a
1b560 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1b570 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20  atabase",.  "   
1b580 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65 20 4e       --maxsize N
1b590 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 73 69 7a       Maximum siz
1b5a0 65 20 66 6f 72 20 2d 2d 68 65 78 64 62 20 6f 72  e for --hexdb or
1b5b0 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 64 20   --deserialized 
1b5c0 64 61 74 61 62 61 73 65 22 2c 0a 23 65 6e 64 69  database",.#endi
1b5d0 66 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6e  f.  "        --n
1b5e0 65 77 20 20 20 20 20 20 20 20 20 20 20 49 6e 69  ew           Ini
1b5f0 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20  tialize FILE to 
1b600 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  an empty databas
1b610 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  e",.  "        -
1b620 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 4f  -readonly      O
1b630 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c  pen FILE readonl
1b640 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  y",.  "        -
1b650 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20 20 46  -zip           F
1b660 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72 63  ILE is a ZIP arc
1b670 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70 75  hive",.  ".outpu
1b680 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20 20  t ?FILE?        
1b690 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
1b6a0 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75 74  o FILE or stdout
1b6b0 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69 74   if FILE is omit
1b6c0 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49 66  ted",.  "     If
1b6d0 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74   FILE begins wit
1b6e0 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20  h '|' then open 
1b6f0 69 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c 0a  it as a pipe.",.
1b700 20 20 22 2e 70 61 72 61 6d 65 74 65 72 20 43 4d    ".parameter CM
1b710 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61 6e 61  D ...       Mana
1b720 67 65 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72  ge SQL parameter
1b730 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20   bindings",.  " 
1b740 20 20 63 6c 65 61 72 20 20 20 20 20 20 20 20 20    clear         
1b750 20 20 20 20 20 20 20 20 20 20 45 72 61 73 65 20            Erase 
1b760 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20  all bindings",. 
1b770 20 22 20 20 20 69 6e 69 74 20 20 20 20 20 20 20   "   init       
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 69               Ini
1b790 74 69 61 6c 69 7a 65 20 74 68 65 20 54 45 4d 50  tialize the TEMP
1b7a0 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f 6c 64   table that hold
1b7b0 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22  s bindings",.  "
1b7c0 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
1b7d0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1b7e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 61  the current para
1b7f0 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c  meter bindings",
1b800 0a 20 20 22 20 20 20 73 65 74 20 50 41 52 41 4d  .  "   set PARAM
1b810 45 54 45 52 20 56 41 4c 55 45 20 20 20 20 20 47  ETER VALUE     G
1b820 69 76 65 6e 20 53 51 4c 20 70 61 72 61 6d 65 74  iven SQL paramet
1b830 65 72 20 50 41 52 41 4d 45 54 45 52 20 61 20 76  er PARAMETER a v
1b840 61 6c 75 65 20 6f 66 20 56 41 4c 55 45 22 2c 0a  alue of VALUE",.
1b850 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1b870 52 41 4d 45 54 45 52 20 73 68 6f 75 6c 64 20 73  RAMETER should s
1b880 74 61 72 74 20 77 69 74 68 20 27 24 27 2c 20 27  tart with '$', '
1b890 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f 27 22  :', '@', or '?'"
1b8a0 2c 0a 20 20 22 20 20 20 75 6e 73 65 74 20 50 41  ,.  "   unset PA
1b8b0 52 41 4d 45 54 45 52 20 20 20 20 20 20 20 20 20  RAMETER         
1b8c0 52 65 6d 6f 76 65 20 50 41 52 41 4d 45 54 45 52  Remove PARAMETER
1b8d0 20 66 72 6f 6d 20 74 68 65 20 62 69 6e 64 69 6e   from the bindin
1b8e0 67 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e 70 72  g table",.  ".pr
1b8f0 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20  int STRING...   
1b900 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65        Print lite
1b910 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23 69 66  ral STRING",.#if
1b920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b930 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
1b940 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73 73 20  CK.  ".progress 
1b950 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  N              I
1b960 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73 73 20 68  nvoke progress h
1b970 61 6e 64 6c 65 72 20 61 66 74 65 72 20 65 76 65  andler after eve
1b980 72 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c 0a 20  ry N opcodes",. 
1b990 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e 20 20   "   --limit N  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
1b9b0 6e 74 65 72 72 75 70 74 20 61 66 74 65 72 20 4e  nterrupt after N
1b9c0 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
1b9d0 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6f 6e  cks",.  "   --on
1b9e0 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ce              
1b9f0 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65        Do no more
1ba00 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67 72 65   than one progre
1ba10 73 73 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 20  ss interrupt",. 
1ba20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d 71 20   "   --quiet|-q 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
1ba40 6f 20 6f 75 74 70 75 74 20 65 78 63 65 70 74 20  o output except 
1ba50 61 74 20 69 6e 74 65 72 72 75 70 74 73 22 2c 0a  at interrupts",.
1ba60 20 20 22 20 20 20 2d 2d 72 65 73 65 74 20 20 20    "   --reset   
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20  Reset the count 
1ba90 66 6f 72 20 65 61 63 68 20 69 6e 70 75 74 20 61  for each input a
1baa0 6e 64 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 23  nd interrupt",.#
1bab0 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d 70 74  endif.  ".prompt
1bac0 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20   MAIN CONTINUE  
1bad0 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74    Replace the st
1bae0 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c  andard prompts",
1baf0 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20  .  ".quit       
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
1bb10 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c  t this program",
1bb20 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20  .  ".read FILE  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61               Rea
1bb40 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c  d input from FIL
1bb50 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65 20  E",.  ".restore 
1bb60 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20  ?DB? FILE       
1bb70 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20  Restore content 
1bb80 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  of DB (default \
1bb90 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49  "main\") from FI
1bba0 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46 49  LE",.  ".save FI
1bbb0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1bbc0 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79   Write in-memory
1bbd0 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46   database into F
1bbe0 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74  ILE",.  ".scanst
1bbf0 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ats on|off      
1bc00 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73    Turn sqlite3_s
1bc10 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
1bc20 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f   metrics on or o
1bc30 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20  ff",.  ".schema 
1bc40 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20 20  ?PATTERN?       
1bc50 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45   Show the CREATE
1bc60 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63   statements matc
1bc70 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a 20  hing PATTERN",. 
1bc80 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22   "     Options:"
1bc90 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d 2d  ,.  "         --
1bca0 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20  indent          
1bcb0 20 20 54 72 79 20 74 6f 20 70 72 65 74 74 79 2d    Try to pretty-
1bcc0 70 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d 61  print the schema
1bcd0 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20  ",.  ".selftest 
1bce0 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 52  ?OPTIONS?      R
1bcf0 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64  un tests defined
1bd00 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54   in the SELFTEST
1bd10 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1bd20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1bd30 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20 20       --init     
1bd40 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65            Create
1bd50 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54 20   a new SELFTEST 
1bd60 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20  table",.  "     
1bd70 20 20 2d 76 20 20 20 20 20 20 20 20 20 20 20 20    -v            
1bd80 20 20 20 20 20 20 20 56 65 72 62 6f 73 65 20 6f         Verbose o
1bd90 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70 61  utput",.  ".sepa
1bda0 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20  rator COL ?ROW? 
1bdb0 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63      Change the c
1bdc0 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65  olumn and row se
1bdd0 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20 64  parators",.#if d
1bde0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1bdf0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20  ABLE_SESSION).  
1be00 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f  ".session ?NAME?
1be10 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74 65   CMD ...  Create
1be20 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73   or control sess
1be30 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75 62  ions",.  "   Sub
1be40 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20  commands:",.  " 
1be50 20 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45      attach TABLE
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74               Att
1be70 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22 20  ach TABLE",.  " 
1be80 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 46 49      changeset FI
1be90 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72 69  LE           Wri
1bea0 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 69  te a changeset i
1beb0 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20  nto FILE",.  "  
1bec0 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20     close        
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73              Clos
1bee0 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a  e one session",.
1bef0 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20 3f    "     enable ?
1bf00 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20  BOOLEAN?        
1bf10 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68   Set or query th
1bf20 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20  e enable bit",. 
1bf30 20 22 20 20 20 20 20 66 69 6c 74 65 72 20 47 4c   "     filter GL
1bf40 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  OB...           
1bf50 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61  Reject tables ma
1bf60 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20  tching GLOBs",. 
1bf70 20 22 20 20 20 20 20 69 6e 64 69 72 65 63 74 20   "     indirect 
1bf80 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
1bf90 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68  Mark or query th
1bfa0 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75  e indirect statu
1bfb0 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65 6d  s",.  "     isem
1bfc0 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20  pty             
1bfd0 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68       Query wheth
1bfe0 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69  er the session i
1bff0 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20 20  s empty",.  "   
1c000 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20    list          
1c010 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1c020 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73  currently open s
1c030 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20  ession names",. 
1c040 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20 4e   "     open DB N
1c050 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20  AME             
1c060 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  Open a new sessi
1c070 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20  on on DB",.  "  
1c080 20 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45     patchset FILE
1c090 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
1c0a0 65 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74  e a patchset int
1c0b0 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 49  o FILE",.  "   I
1c0c0 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74  f ?NAME? is omit
1c0d0 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64  ted, the first d
1c0e0 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69  efined session i
1c0f0 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66  s used.",.#endif
1c100 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e  .  ".sha3sum ...
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6d               Com
1c120 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68  pute a SHA3 hash
1c130 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
1c140 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f 70  tent",.  "    Op
1c150 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1c160 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20 20    --schema      
1c170 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61 73          Also has
1c180 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  h the sqlite_mas
1c190 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22 20  ter table",.  " 
1c1a0 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34 20       --sha3-224 
1c1b0 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1c1c0 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67 6f  he sha3-224 algo
1c1d0 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20  rithm",.  "     
1c1e0 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20 20   --sha3-256     
1c1f0 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1c200 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74 68  ha3-256 algorith
1c210 6d 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  m.  This is the 
1c220 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20  default.",.  "  
1c230 20 20 20 20 2d 2d 73 68 61 33 2d 33 38 34 20 20      --sha3-384  
1c240 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1c250 65 20 73 68 61 33 2d 33 38 34 20 61 6c 67 6f 72  e sha3-384 algor
1c260 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20  ithm",.  "      
1c270 2d 2d 73 68 61 33 2d 35 31 32 20 20 20 20 20 20  --sha3-512      
1c280 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1c290 61 33 2d 35 31 32 20 61 6c 67 6f 72 69 74 68 6d  a3-512 algorithm
1c2a0 22 2c 0a 20 20 22 20 20 20 20 41 6e 79 20 6f 74  ",.  "    Any ot
1c2b0 68 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  her argument is 
1c2c0 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66  a LIKE pattern f
1c2d0 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 68 61 73  or tables to has
1c2e0 68 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h",.#ifndef SQLI
1c2f0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
1c300 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41  .  ".shell CMD A
1c310 52 47 53 2e 2e 2e 20 20 20 20 20 20 20 52 75 6e  RGS...       Run
1c320 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
1c330 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c  a system shell",
1c340 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77  .#endif.  ".show
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72      Show the cur
1c370 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
1c380 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73  various settings
1c390 22 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e  ",.  ".stats ?on
1c3a0 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 20 20 53  |off?          S
1c3b0 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72  how stats or tur
1c3c0 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66  n stats on or of
1c3d0 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f",.#ifndef SQLI
1c3e0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
1c3f0 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20  .  ".system CMD 
1c400 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 52 75 6e  ARGS...      Run
1c410 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
1c420 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c  a system shell",
1c430 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c  .#endif.  ".tabl
1c440 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  es ?TABLE?      
1c450 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f      List names o
1c460 66 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  f tables matchin
1c470 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54  g LIKE pattern T
1c480 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74 63  ABLE",.  ".testc
1c490 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20  ase NAME        
1c4a0 20 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63     Begin redirec
1c4b0 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27  ting output to '
1c4c0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
1c4d0 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20  '",.  ".timeout 
1c4e0 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MS              
1c4f0 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b  Try opening lock
1c500 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53  ed tables for MS
1c510 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a   milliseconds",.
1c520 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66    ".timer on|off
1c530 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e              Turn
1c540 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72   SQL timer on or
1c550 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53   off",.#ifndef S
1c560 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1c570 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54 49  .  ".trace ?OPTI
1c580 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75 74  ONS?         Out
1c590 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61  put each SQL sta
1c5a0 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20  tement as it is 
1c5b0 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49 4c  run",.  "    FIL
1c5c0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1c5d0 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
1c5e0 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
1c5f0 20 20 73 74 64 6f 75 74 20 20 20 20 20 20 20 20    stdout        
1c600 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f            Send o
1c610 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74 22  utput to stdout"
1c620 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72 72 20  ,.  "    stderr 
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
1c650 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20 20  stderr",.  "    
1c660 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
1c670 20 20 20 20 20 20 20 20 44 69 73 61 62 6c 65 20          Disable 
1c680 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20 20  tracing",.  "   
1c690 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20 20   --expanded     
1c6a0 20 20 20 20 20 20 20 20 20 45 78 70 61 6e 64 20           Expand 
1c6b0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
1c6c0 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ",.#ifdef SQLITE
1c6d0 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a  _ENABLE_NORMALIZ
1c6e0 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d 61  E.  "    --norma
1c6f0 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20 20 20  lized           
1c700 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c 20   Normal the SQL 
1c710 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65 6e  statements",.#en
1c720 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c 61  dif.  "    --pla
1c730 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
1c740 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20 69     Show SQL as i
1c750 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20 22  t is input",.  "
1c760 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20 20      --stmt      
1c770 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1c780 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63  e statement exec
1c790 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54 52  ution (SQLITE_TR
1c7a0 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22 20  ACE_STMT)",.  " 
1c7b0 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20 20     --profile    
1c7c0 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 66 69             Profi
1c7d0 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28 53  le statements (S
1c7e0 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46  QLITE_TRACE_PROF
1c7f0 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d  ILE)",.  "    --
1c800 72 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  row             
1c810 20 20 20 20 20 20 54 72 61 63 65 20 65 61 63 68        Trace each
1c820 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52 41   row (SQLITE_TRA
1c830 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20 20  CE_ROW)",.  "   
1c840 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20 20   --close        
1c850 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20 63           Trace c
1c860 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 20  onnection close 
1c870 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c  (SQLITE_TRACE_CL
1c880 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f 2a  OSE)",.#endif /*
1c890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1c8a0 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e 66  CE */.  ".vfsinf
1c8b0 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  o ?AUX?         
1c8c0 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62    Information ab
1c8d0 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  out the top-leve
1c8e0 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c  l VFS",.  ".vfsl
1c8f0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1c900 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61      List all ava
1c910 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a 20  ilable VFSes",. 
1c920 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f   ".vfsname ?AUX?
1c930 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74             Print
1c940 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1c950 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20 22   VFS stack",.  "
1c960 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32  .width NUM1 NUM2
1c970 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c   ...     Set col
1c980 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c  umn widths for \
1c990 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c  "column\" mode",
1c9a0 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74 69 76  .  "     Negativ
1c9b0 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a  e values right-j
1c9c0 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a  ustify",.};../*.
1c9d0 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20 74  ** Output help t
1c9e0 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74  ext..**.** zPatt
1c9f0 65 72 6e 20 64 65 73 63 72 69 62 65 73 20 74 68  ern describes th
1ca00 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64  e set of command
1ca10 73 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c 70  s for which help
1ca20 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65   text is provide
1ca30 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65 72  d..** If zPatter
1ca40 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
1ca50 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64  show all command
1ca60 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76 65  s, but only give
1ca70 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64   a one-line.** d
1ca80 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61  escription of ea
1ca90 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ch..**.** Return
1caa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
1cab0 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
1cac0 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28 46  c int showHelp(F
1cad0 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
1cae0 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b  char *zPattern){
1caf0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1cb00 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74  int j = 0;.  int
1cb10 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a   n = 0;.  char *
1cb20 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61 74  zPat;.  if( zPat
1cb30 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50  tern==0.   || zP
1cb40 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20  attern[0]=='0'. 
1cb50 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74    || strcmp(zPat
1cb60 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20 20  tern,"-a")==0.  
1cb70 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74   || strcmp(zPatt
1cb80 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20  ern,"-all")==0. 
1cb90 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77 20   ){.    /* Show 
1cba0 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75  all commands, bu
1cbb0 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65 20  t only one line 
1cbc0 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  per command */. 
1cbd0 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d     if( zPattern=
1cbe0 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d 20  =0 ) zPattern = 
1cbf0 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  "";.    for(i=0;
1cc00 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48   i<ArraySize(azH
1cc10 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  elp); i++){.    
1cc20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b    if( azHelp[i][
1cc30 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 74  0]=='.' || zPatt
1cc40 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ern[0] ){.      
1cc50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1cc60 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1cc70 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  p[i]);.        n
1cc80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1cc90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1cca0 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61  * Look for comma
1ccb0 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77 68 69  nds that for whi
1ccc0 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61  ch zPattern is a
1ccd0 6e 20 65 78 61 63 74 20 70 72 65 66 69 78 20 2a  n exact prefix *
1cce0 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c  /.    zPat = sql
1ccf0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25  ite3_mprintf(".%
1cd00 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a  s*", zPattern);.
1cd10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1cd20 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1cd30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1cd40 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
1cd50 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69  b(zPat, azHelp[i
1cd60 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1cd70 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1cd80 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1cd90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  [i]);.        j 
1cda0 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e  = i+1;.        n
1cdb0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1cdc0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1cdd0 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69 66  ee(zPat);.    if
1cde0 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( n ){.      if(
1cdf0 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   n==1 ){.       
1ce00 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65 72   /* when zPatter
1ce10 6e 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  n is a prefix of
1ce20 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d   exactly one com
1ce30 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75  mand, then inclu
1ce40 64 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  de the.        *
1ce50 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 61  * details of tha
1ce60 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68  t command, which
1ce70 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61 74   should begin at
1ce80 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20   offset j */.   
1ce90 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72       while( j<Ar
1cea0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d  raySize(azHelp)-
1ceb0 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30  1 && azHelp[j][0
1cec0 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]!='.' ){.      
1ced0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1cee0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1cef0 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  elp[j]);.       
1cf00 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
1cf10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1cf20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a  return n;.    }.
1cf30 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
1cf40 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63 6f  commands that co
1cf50 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20 61  ntain zPattern a
1cf60 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20 74  nywhere.  Show t
1cf70 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20  he complete.    
1cf80 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20 63  ** text of all c
1cf90 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61 74  ommands that mat
1cfa0 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20  ch. */.    zPat 
1cfb0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1cfc0 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61 74  f("%%%s%%", zPat
1cfd0 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  tern);.    for(i
1cfe0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1cff0 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20  azHelp); i++){. 
1d000 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b       if( azHelp[
1d010 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d  i][0]=='.' ) j =
1d020 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   i;.      if( sq
1d030 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50  lite3_strlike(zP
1d040 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30  at, azHelp[i], 0
1d050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1d060 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1d070 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1d080 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  j]);.        whi
1d090 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  le( j<ArraySize(
1d0a0 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48  azHelp)-1 && azH
1d0b0 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27  elp[j+1][0]!='.'
1d0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b   ){.          j+
1d0d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  +;.          utf
1d0e0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1d0f0 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29  s\n", azHelp[j])
1d100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d110 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20      i = j;.     
1d120 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
1d130 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d140 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20  3_free(zPat);.  
1d150 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
1d160 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1d170 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
1d180 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  int process_inpu
1d190 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
1d1a0 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  ;../*.** Read th
1d1b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c  e content of fil
1d1c0 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d  e zName into mem
1d1d0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1d1e0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1d1f0 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75  64().** and retu
1d200 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1d210 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20  the buffer. The 
1d220 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1d230 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
1d240 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e  g.** the memory.
1d250 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1d260 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f  ter pnByte is no
1d270 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65  t NULL, (*pnByte
1d280 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  ) is set to the 
1d290 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
1d2a0 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  ** read..**.** F
1d2b0 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20  or convenience, 
1d2c0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  a nul-terminator
1d2d0 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20   byte is always 
1d2e0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1d2f0 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f  data read.** fro
1d300 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  m the file befor
1d310 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  e the buffer is 
1d320 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62  returned. This b
1d330 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75  yte is not inclu
1d340 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ded in.** the fi
1d350 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70  nal value of (*p
1d360 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69  nByte), if appli
1d370 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c  cable..**.** NUL
1d380 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
1d390 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
1d3a0 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66  countered. The f
1d3b0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
1d3c0 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65  nByte.** is unde
1d3d0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
1d3e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
1d3f0 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
1d400 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1d410 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20  int *pnByte){.  
1d420 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e  FILE *in = fopen
1d430 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20  (zName, "rb");. 
1d440 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a   long nIn;.  siz
1d450 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61  e_t nRead;.  cha
1d460 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69  r *pBuf;.  if( i
1d470 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
1d480 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20  .  fseek(in, 0, 
1d490 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e  SEEK_END);.  nIn
1d4a0 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20   = ftell(in);.  
1d4b0 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42  rewind(in);.  pB
1d4c0 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
1d4d0 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a  loc64( nIn+1 );.
1d4e0 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
1d4f0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74   fclose(in); ret
1d500 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64  urn 0; }.  nRead
1d510 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e   = fread(pBuf, n
1d520 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63  In, 1, in);.  fc
1d530 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20  lose(in);.  if( 
1d540 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20  nRead!=1 ){.    
1d550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
1d560 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  f);.    return 0
1d570 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e  ;.  }.  pBuf[nIn
1d580 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42  ] = 0;.  if( pnB
1d590 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20  yte ) *pnByte = 
1d5a0 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  nIn;.  return pB
1d5b0 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  uf;.}..#if defin
1d5c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1d5d0 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20  _SESSION)./*.** 
1d5e0 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f  Close a single O
1d5f0 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63  penSession objec
1d600 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  t and release al
1d610 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61  l of its associa
1d620 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73  ted.** resources
1d630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d640 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f   session_close(O
1d650 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
1d660 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  sion){.  int i;.
1d670 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
1d680 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e  _delete(pSession
1d690 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->p);.  sqlite3_
1d6a0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a  free(pSession->z
1d6b0 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Name);.  for(i=0
1d6c0 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46  ; i<pSession->nF
1d6d0 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ilter; i++){.   
1d6e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1d6f0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
1d700 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
1d710 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
1d720 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20  n->azFilter);.  
1d730 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c  memset(pSession,
1d740 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53   0, sizeof(OpenS
1d750 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64  ession));.}.#end
1d760 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
1d770 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  all OpenSession 
1d780 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65  objects and rele
1d790 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  ase all associat
1d7a0 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ed resources..*/
1d7b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d7c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1d7d0 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ON).static void 
1d7e0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1d7f0 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  l(ShellState *p)
1d800 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1d810 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
1d820 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ion; i++){.    s
1d830 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d  ession_close(&p-
1d840 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20  >aSession[i]);. 
1d850 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   }.  p->nSession
1d860 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20   = 0;.}.#else.# 
1d870 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63  define session_c
1d880 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64  lose_all(X).#end
1d890 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  if../*.** Implem
1d8a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1d8b0 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e  xFilter function
1d8c0 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73   for an open ses
1d8d0 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61  sion.  Omit.** a
1d8e0 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20  ny tables named 
1d8f0 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c  by ".session fil
1d900 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c  ter" but let all
1d910 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72   other table thr
1d920 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ough..*/.#if def
1d930 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d940 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
1d950 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66  ic int session_f
1d960 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78  ilter(void *pCtx
1d970 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
1d980 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69  ab){.  OpenSessi
1d990 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28  on *pSession = (
1d9a0 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74  OpenSession*)pCt
1d9b0 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  x;.  int i;.  fo
1d9c0 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f  r(i=0; i<pSessio
1d9d0 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29  n->nFilter; i++)
1d9e0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1d9f0 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69  3_strglob(pSessi
1da00 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c  on->azFilter[i],
1da10 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   zTab)==0 ) retu
1da20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1da30 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
1da40 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64  /*.** Try to ded
1da50 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  uce the type of 
1da60 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62  file for zName b
1da70 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74  ased on its cont
1da80 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
1da90 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c  one of the SHELL
1daa0 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74  _OPEN_* constant
1dab0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1dac0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
1dad0 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20  ist or is empty 
1dae0 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f  but its name loo
1daf0 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a  ks like a ZIP.**
1db00 20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68 65   archive and the
1db10 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69 73   dfltZip flag is
1db20 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73 75   true, then assu
1db30 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50 20 61  me it is a ZIP a
1db40 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72  rchive..** Other
1db50 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e 20  wise, assume an 
1db60 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62 61 73  ordinary databas
1db70 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
1db80 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a  the filename if.
1db90 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e  ** the type cann
1dba0 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ot be determined
1dbb0 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a   from content..*
1dbc0 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74 61  /.int deduceData
1dbd0 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20 63  baseType(const c
1dbe0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
1dbf0 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45  dfltZip){.  FILE
1dc00 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d   *f = fopen(zNam
1dc10 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65  e, "rb");.  size
1dc20 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d  _t n;.  int rc =
1dc30 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
1dc40 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  EC;.  char zBuf[
1dc50 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30  100];.  if( f==0
1dc60 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c 74   ){.    if( dflt
1dc70 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73  Zip && sqlite3_s
1dc80 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a  trlike("%.zip",z
1dc90 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  Name,0)==0 ){.  
1dca0 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c       return SHEL
1dcb0 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1dcc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dcd0 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f    return SHELL_O
1dce0 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  PEN_NORMAL;.    
1dcf0 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61  }.  }.  n = frea
1dd00 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20 66  d(zBuf, 16, 1, f
1dd10 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  );.  if( n==1 &&
1dd20 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53   memcmp(zBuf, "S
1dd30 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c  QLite format 3",
1dd40 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66   16)==0 ){.    f
1dd50 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72 65  close(f);.    re
1dd60 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1dd70 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73  NORMAL;.  }.  fs
1dd80 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b  eek(f, -25, SEEK
1dd90 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65  _END);.  n = fre
1dda0 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20  ad(zBuf, 25, 1, 
1ddb0 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1ddc0 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1ddd0 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33  Start-Of-SQLite3
1dde0 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  -", 17)==0 ){.  
1ddf0 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1de00 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d  N_APPENDVFS;.  }
1de10 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28  else{.    fseek(
1de20 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44  f, -22, SEEK_END
1de30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  );.    n = fread
1de40 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29  (zBuf, 22, 1, f)
1de50 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26  ;.    if( n==1 &
1de60 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20  & zBuf[0]==0x50 
1de70 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62  && zBuf[1]==0x4b
1de80 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30   && zBuf[2]==0x0
1de90 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66  5.       && zBuf
1dea0 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20  [3]==0x06 ){.   
1deb0 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1dec0 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1ded0 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26  }else if( n==0 &
1dee0 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c  & dfltZip && sql
1def0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e  ite3_strlike("%.
1df00 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30  zip",zName,0)==0
1df10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1df20 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1df30 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  E;.    }.  }.  f
1df40 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74 75  close(f);.  retu
1df50 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66 64  rn rc;  .}..#ifd
1df60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1df70 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a 0a  _DESERIALIZE./*.
1df80 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20 61  ** Reconstruct a
1df90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1dfa0 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 6f  base using the o
1dfb0 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 22  utput from the "
1dfc0 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f 67  dbtotxt".** prog
1dfd0 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74 65  ram.  Read conte
1dfe0 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  nt from the file
1dff0 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61   in p->zDbFilena
1e000 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46 69  me.  If p->zDbFi
1e010 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c 20  lename.** is 0, 
1e020 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73  then read from s
1e030 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a  tandard input..*
1e040 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
1e050 64 20 63 68 61 72 20 2a 72 65 61 64 48 65 78 44  d char *readHexD
1e060 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  b(ShellState *p,
1e070 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a 20   int *pnData){. 
1e080 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e090 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69  a = 0;.  int nLi
1e0a0 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  ne;.  int n = 0;
1e0b0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b  .  int pgsz = 0;
1e0c0 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d  .  int iOffset =
1e0d0 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a   0;.  int j, k;.
1e0e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45    int rc;.  FILE
1e0f0 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *in;.  unsigned
1e100 20 63 68 61 72 20 78 5b 31 36 5d 3b 0a 20 20 63   char x[16];.  c
1e110 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
1e120 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c  .  if( p->zDbFil
1e130 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20  ename ){.    in 
1e140 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  = fopen(p->zDbFi
1e150 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20  lename, "r");.  
1e160 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1e170 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e180 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
1e190 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
1e1a0 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e   reading\n", p->
1e1b0 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1e1c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e1d0 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20    }.    nLine = 
1e1e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e1f0 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20  in = p->in;.    
1e200 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e  nLine = p->linen
1e210 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61  o;.  }.  *pnData
1e220 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b   = 0;.  nLine++;
1e230 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
1e240 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e250 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74 6f  ), in)==0 ) goto
1e260 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e270 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28  ;.  rc = sscanf(
1e280 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20 25  zLine, "| size %
1e290 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20  d pagesize %d", 
1e2a0 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69 66  &n, &pgsz);.  if
1e2b0 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20 72  ( rc!=2 ) goto r
1e2c0 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a  eadHexDb_error;.
1e2d0 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f 74    if( n<=0 ) got
1e2e0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e2f0 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33  r;.  a = sqlite3
1e300 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  _malloc( n );.  
1e310 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
1e320 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e330 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "Out of memo
1e340 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ry!\n");.    got
1e350 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e360 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  r;.  }.  memset(
1e370 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  a, 0, n);.  if( 
1e380 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a  pgsz<512 || pgsz
1e390 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 20  >65536 || (pgsz 
1e3a0 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29  & (pgsz-1))!=0 )
1e3b0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1e3c0 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61 6c  f(stderr, "inval
1e3d0 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b  id pagesize\n");
1e3e0 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65  .    goto readHe
1e3f0 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  xDb_error;.  }. 
1e400 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67   for(nLine++; fg
1e410 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
1e420 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30  f(zLine), in)!=0
1e430 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20  ; nLine++){.    
1e440 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e450 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f 66  e, "| page %d of
1e460 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b  fset %d", &j, &k
1e470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 32  );.    if( rc==2
1e480 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73 65   ){.      iOffse
1e490 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e  t = k;.      con
1e4a0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1e4b0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69   if( strncmp(zLi
1e4c0 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29  ne, "| end ", 6)
1e4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
1e4e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1e4f0 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c   = sscanf(zLine,
1e500 22 7c 20 25 64 3a 20 25 68 68 78 20 25 68 68 78  "| %d: %hhx %hhx
1e510 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20   %hhx %hhx %hhx 
1e520 25 68 68 78 20 25 68 68 78 20 25 68 68 78 22 0a  %hhx %hhx %hhx".
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 20 20 22 20 20 25 68 68 78 20 25 68        "  %hhx %h
1e550 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68  hx %hhx %hhx %hh
1e560 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78  x %hhx %hhx %hhx
1e570 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e580 20 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78     &j, &x[0], &x
1e590 5b 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33  [1], &x[2], &x[3
1e5a0 5d 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c  ], &x[4], &x[5],
1e5b0 20 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20   &x[6], &x[7],. 
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1e5d0 78 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b  x[8], &x[9], &x[
1e5e0 31 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b  10], &x[11], &x[
1e5f0 31 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b  12], &x[13], &x[
1e600 31 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20  14], &x[15]);.  
1e610 20 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a    if( rc==17 ){.
1e620 20 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65        k = iOffse
1e630 74 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  t+j;.      if( k
1e640 2b 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20  +16<=n ){.      
1e650 20 20 6d 65 6d 63 70 79 28 61 2b 6b 2c 20 78 2c    memcpy(a+k, x,
1e660 20 31 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   16);.      }.  
1e670 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74    }.  }.  *pnDat
1e680 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21  a = n;.  if( in!
1e690 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63  =p->in ){.    fc
1e6a0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73  lose(in);.  }els
1e6b0 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f  e{.    p->lineno
1e6c0 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1e6d0 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48  return a;..readH
1e6e0 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66  exDb_error:.  if
1e6f0 28 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20  ( in!=stdin ){. 
1e700 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1e710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1e720 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  e( fgets(zLine, 
1e730 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70  sizeof(zLine), p
1e740 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  ->in)!=0 ){.    
1e750 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
1e760 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e   if(strncmp(zLin
1e770 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
1e780 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1e790 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  }.    p->lineno 
1e7a0 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73  = nLine;.  }.  s
1e7b0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1e7c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e7d0 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c  derr,"Error on l
1e7e0 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64  ine %d of --hexd
1e7f0 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e  b input\n", nLin
1e800 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  e);.  return 0;.
1e810 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e820 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1e830 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALIZE */../*.** 
1e840 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  Scalar function 
1e850 22 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72  "shell_escape_cr
1e860 6e 6c 22 20 75 73 65 64 20 62 79 20 74 68 65 20  nl" used by the 
1e870 2e 72 65 63 6f 76 65 72 20 63 6f 6d 6d 61 6e 64  .recover command
1e880 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
1e890 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1e8a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
1e8b0 20 6f 75 74 70 75 74 20 6f 66 20 62 75 69 6c 74   output of built
1e8c0 2d 69 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  -in.** function 
1e8d0 71 75 6f 74 65 28 29 2e 20 49 66 20 74 68 65 20  quote(). If the 
1e8e0 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
1e8f0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  of the input is 
1e900 22 27 22 2c 20 0a 2a 2a 20 69 6e 64 69 63 61 74  "'", .** indicat
1e910 69 6e 67 20 74 68 61 74 20 74 68 65 20 76 61 6c  ing that the val
1e920 75 65 20 70 61 73 73 65 64 20 74 6f 20 71 75 6f  ue passed to quo
1e930 74 65 28 29 20 77 61 73 20 61 20 74 65 78 74 20  te() was a text 
1e940 76 61 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74  value,.** then t
1e950 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
1e960 72 63 68 65 73 20 74 68 65 20 69 6e 70 75 74 20  rches the input 
1e970 66 6f 72 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72  for "\n" and "\r
1e980 22 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  " characters.** 
1e990 61 6e 64 20 61 64 64 73 20 61 20 77 72 61 70 70  and adds a wrapp
1e9a0 65 72 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  er similar to th
1e9b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1e9c0 2a 2a 20 20 20 72 65 70 6c 61 63 65 28 72 65 70  **   replace(rep
1e9d0 6c 61 63 65 28 3c 69 6e 70 75 74 3e 2c 20 27 5c  lace(<input>, '\
1e9e0 6e 27 2c 20 63 68 61 72 28 31 30 29 2c 20 27 5c  n', char(10), '\
1e9f0 72 27 2c 20 63 68 61 72 28 31 33 29 29 3b 0a 2a  r', char(13));.*
1ea00 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
1ea10 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
1ea20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  of the input is 
1ea30 6e 6f 74 20 22 27 22 2c 20 74 68 65 6e 20 61 20  not "'", then a 
1ea40 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 69  copy.** of the i
1ea50 6e 70 75 74 20 69 73 20 72 65 74 75 72 6e 65 64  nput is returned
1ea60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ea70 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c   shellEscapeCrnl
1ea80 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1ea90 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
1eaa0 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71   int argc, .  sq
1eab0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1eac0 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
1ead0 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
1eae0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1eaf0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1eb00 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 54 65 78  [0]);.  if( zTex
1eb10 74 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  t[0]=='\'' ){.  
1eb20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73 71    int nText = sq
1eb30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1eb40 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
1eb50 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
1eb60 7a 42 75 66 31 5b 32 30 5d 3b 0a 20 20 20 20 63  zBuf1[20];.    c
1eb70 68 61 72 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20  har zBuf2[20];. 
1eb80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1eb90 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
1eba0 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
1ebb0 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
1ebc0 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20  ;.    int nNL = 
1ebd0 30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0;..    for(i=0;
1ebe0 20 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b   zText[i]; i++){
1ebf0 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c 3d 3d  .      if( zNL==
1ec00 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27  0 && zText[i]=='
1ec10 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  \n' ){.        z
1ec20 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
1ec30 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 6e 22 2c  ng(zText, "\\n",
1ec40 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
1ec50 3b 0a 20 20 20 20 20 20 20 20 6e 4e 4c 20 3d 20  ;.        nNL = 
1ec60 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 4c 29  (int)strlen(zNL)
1ec70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ec80 69 66 28 20 7a 43 52 3d 3d 30 20 26 26 20 7a 54  if( zCR==0 && zT
1ec90 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a  ext[i]=='\r' ){.
1eca0 20 20 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e          zCR = un
1ecb0 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78  used_string(zTex
1ecc0 74 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  t, "\\r", "\\015
1ecd0 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 20  ", zBuf2);.     
1ece0 20 20 20 6e 43 52 20 3d 20 28 69 6e 74 29 73 74     nCR = (int)st
1ecf0 72 6c 65 6e 28 7a 43 52 29 3b 0a 20 20 20 20 20  rlen(zCR);.     
1ed00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1ed10 28 20 7a 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a  ( zNL || zCR ){.
1ed20 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d        int iOut =
1ed30 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 4d   0;.      i64 nM
1ed40 61 78 20 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52 29  ax = (nNL > nCR)
1ed50 20 3f 20 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20   ? nNL : nCR;.  
1ed60 20 20 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20 3d      i64 nAlloc =
1ed70 20 6e 4d 61 78 20 2a 20 6e 54 65 78 74 20 2b 20   nMax * nText + 
1ed80 28 6e 4d 61 78 2b 31 32 29 2a 32 3b 0a 20 20 20  (nMax+12)*2;.   
1ed90 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
1eda0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
1edb0 61 6c 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b  alloc64(nAlloc);
1edc0 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d  .      if( zOut=
1edd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1ede0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1edf0 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
1ee00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ee10 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  n;.      }..    
1ee20 20 20 69 66 28 20 7a 4e 4c 20 26 26 20 7a 43 52    if( zNL && zCR
1ee30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1ee40 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1ee50 22 72 65 70 6c 61 63 65 28 72 65 70 6c 61 63 65  "replace(replace
1ee60 28 22 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  (", 16);.       
1ee70 20 69 4f 75 74 20 2b 3d 20 31 36 3b 0a 20 20 20   iOut += 16;.   
1ee80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee90 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1eea0 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65 28 22  Out], "replace("
1eeb0 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  , 8);.        iO
1eec0 75 74 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 7d  ut += 8;.      }
1eed0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1eee0 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zText[i]; i++){.
1eef0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 65 78          if( zTex
1ef00 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  t[i]=='\n' ){.  
1ef10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1ef20 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c  zOut[iOut], zNL,
1ef30 20 6e 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 20   nNL);.         
1ef40 20 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20   iOut += nNL;.  
1ef50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ef60 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29  zText[i]=='\r' )
1ef70 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1ef80 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1ef90 7a 43 52 2c 20 6e 43 52 29 3b 0a 20 20 20 20 20  zCR, nCR);.     
1efa0 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 6e 43 52       iOut += nCR
1efb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1efc0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b  .          zOut[
1efd0 69 4f 75 74 5d 20 3d 20 7a 54 65 78 74 5b 69 5d  iOut] = zText[i]
1efe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75 74  ;.          iOut
1eff0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1f000 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1f010 20 7a 4e 4c 20 29 7b 0a 20 20 20 20 20 20 20 20   zNL ){.        
1f020 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f030 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b 20 69 4f  t], ",'", 2); iO
1f040 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ut += 2;.       
1f050 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1f060 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20  ut], zNL, nNL); 
1f070 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20  iOut += nNL;.   
1f080 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75       memcpy(&zOu
1f090 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20 63 68 61  t[iOut], "', cha
1f0a0 72 28 31 30 29 29 22 2c 20 31 32 29 3b 20 69 4f  r(10))", 12); iO
1f0b0 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20 20 20 20  ut += 12;.      
1f0c0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52 20  }.      if( zCR 
1f0d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1f0e0 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22  y(&zOut[iOut], "
1f0f0 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d  ,'", 2); iOut +=
1f100 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   2;.        memc
1f110 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f120 7a 43 52 2c 20 6e 43 52 29 3b 20 69 4f 75 74 20  zCR, nCR); iOut 
1f130 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20 20 20  += nCR;.        
1f140 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f150 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31 33 29  t], "', char(13)
1f160 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d  )", 12); iOut +=
1f170 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   12;.      }..  
1f180 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1f190 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1f1a0 20 7a 4f 75 74 2c 20 69 4f 75 74 2c 20 53 51 4c   zOut, iOut, SQL
1f1b0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1f1c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1f1d0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
1f1e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
1f1f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
1f200 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
1f210 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a  t, argv[0]);.}..
1f220 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f 70 65  /* Flags for ope
1f230 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  n_db()..**.** Th
1f240 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
1f250 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20  or of open_db() 
1f260 69 73 20 74 6f 20 65 78 69 74 28 31 29 20 69 66  is to exit(1) if
1f270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61   the database fa
1f280 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20  ils to.** open. 
1f290 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45   The OPEN_DB_KEE
1f2a0 50 41 4c 49 56 45 20 66 6c 61 67 20 63 68 61 6e  PALIVE flag chan
1f2b0 67 65 73 20 74 68 61 74 20 73 6f 20 74 68 61 74  ges that so that
1f2c0 20 69 74 20 70 72 69 6e 74 73 20 61 6e 20 65 72   it prints an er
1f2d0 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c  ror.** but still
1f2e0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
1f2f0 20 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a   calling exit..*
1f300 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42  *.** The OPEN_DB
1f310 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67 20 63 61  _ZIPFILE flag ca
1f320 75 73 65 73 20 6f 70 65 6e 5f 64 62 28 29 20 74  uses open_db() t
1f330 6f 20 70 72 65 66 65 72 20 74 6f 20 6f 70 65 6e  o prefer to open
1f340 20 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a   files as a.** Z
1f350 49 50 20 61 72 63 68 69 76 65 20 69 66 20 74 68  IP archive if th
1f360 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1f370 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74  exist or is empt
1f380 79 20 61 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d  y and its name m
1f390 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e  atches.** the *.
1f3a0 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a  zip pattern..*/.
1f3b0 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f  #define OPEN_DB_
1f3c0 4b 45 45 50 41 4c 49 56 45 20 20 20 30 78 30 30  KEEPALIVE   0x00
1f3d0 31 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 66  1   /* Return af
1f3e0 74 65 72 20 65 72 72 6f 72 20 69 66 20 74 72 75  ter error if tru
1f3f0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45  e */.#define OPE
1f400 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20 20 20  N_DB_ZIPFILE    
1f410 20 30 78 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e   0x002   /* Open
1f420 20 61 73 20 5a 49 50 20 69 66 20 6e 61 6d 65 20   as ZIP if name 
1f430 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f  matches *.zip */
1f440 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1f450 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
1f460 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69  s open.  If it i
1f470 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e  s not, then open
1f480 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
1f490 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
1f4a0 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e  o open, print an
1f4b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1f4c0 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74  nd exit..*/.stat
1f4d0 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28  ic void open_db(
1f4e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
1f4f0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20  nt openFlags){. 
1f500 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
1f510 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1f520 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1f530 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20 20 20 20  _UNSPEC ){.     
1f540 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e   if( p->zDbFilen
1f550 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62  ame==0 || p->zDb
1f560 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
1f570 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
1f580 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
1f590 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  EN_NORMAL;.     
1f5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f5b0 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75  p->openMode = (u
1f5c0 38 29 64 65 64 75 63 65 44 61 74 61 62 61 73 65  8)deduceDatabase
1f5d0 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  Type(p->zDbFilen
1f5e0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20     (openFlags & 
1f610 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29  OPEN_DB_ZIPFILE)
1f620 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
1f630 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
1f640 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20  p->openMode ){. 
1f650 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1f660 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20  OPEN_APPENDVFS: 
1f670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f680 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62  3_open_v2(p->zDb
1f690 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1f6a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  , .           SQ
1f6b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1f6c0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1f6d0 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73  CREATE, "apndvfs
1f6e0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
1f6f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1f700 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1f710 5f 48 45 58 44 42 3a 0a 20 20 20 20 20 20 63 61  _HEXDB:.      ca
1f720 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  se SHELL_OPEN_DE
1f730 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20  SERIALIZE: {.   
1f740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1f750 6e 28 30 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  n(0, &p->db);.  
1f760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f770 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1f780 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1f790 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LE: {.        sq
1f7a0 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d  lite3_open(":mem
1f7b0 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a  ory:", &p->db);.
1f7c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1f7e0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41  e SHELL_OPEN_REA
1f7f0 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20  DONLY: {.       
1f800 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1f810 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1f820 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f   &p->db, SQLITE_
1f830 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30  OPEN_READONLY, 0
1f840 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1f850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f860 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1f870 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61  UNSPEC:.      ca
1f880 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f  se SHELL_OPEN_NO
1f890 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  RMAL: {.        
1f8a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
1f8b0 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
1f8c0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1f8d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f8e0 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20   }.    globalDb 
1f8f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
1f900 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c   p->db==0 || SQL
1f910 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
1f920 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
1f930 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1f940 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
1f950 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  r: unable to ope
1f960 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c  n database \"%s\
1f970 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ": %s\n",.      
1f980 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
1f990 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  me, sqlite3_errm
1f9a0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
1f9b0 20 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20    if( openFlags 
1f9c0 26 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  & OPEN_DB_KEEPAL
1f9d0 49 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  IVE ){.        s
1f9e0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
1f9f0 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b  mory:", &p->db);
1fa00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
1fa10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
1fa20 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69  xit(1);.    }.#i
1fa30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fa40 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1fa50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
1fa60 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
1fa70 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65  on(p->db, 1);.#e
1fa80 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
1fa90 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e  _fileio_init(p->
1faa0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
1fab0 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f  qlite3_shathree_
1fac0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1fad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1fae0 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70  ompletion_init(p
1faf0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1fb00 20 73 71 6c 69 74 65 33 5f 64 62 64 61 74 61 5f   sqlite3_dbdata_
1fb10 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1fb20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1fb30 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73  _HAVE_ZLIB.    s
1fb40 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69  qlite3_zipfile_i
1fb50 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
1fb60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71  ;.    sqlite3_sq
1fb70 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  lar_init(p->db, 
1fb80 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
1fb90 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1fba0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1fbb0 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65   "shell_add_sche
1fbc0 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55  ma", 3, SQLITE_U
1fbd0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65      shellAddSche
1fc00 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20  maName, 0, 0);. 
1fc10 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1fc20 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1fc30 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f  , "shell_module_
1fc40 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49  schema", 1, SQLI
1fc50 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64          shellMod
1fc80 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29  uleSchema, 0, 0)
1fc90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1fca0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1fcb0 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73  >db, "shell_puts
1fcc0 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nl", 1, SQLITE_U
1fcd0 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20  TF8, p,.        
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e      shellPutsFun
1fd00 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  c, 0, 0);.    sq
1fd10 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1fd20 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1fd30 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22  ell_escape_crnl"
1fd40 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
1fd50 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c   shellEscapeCrnl
1fd80 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
1fd90 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
1fda0 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65  YSTEM.    sqlite
1fdb0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1fdc0 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
1fdd0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1fde0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
1fe10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1fe20 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
1fe30 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53  db, "edit", 2, S
1fe40 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46             editF
1fe70 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  unc, 0, 0);.#end
1fe80 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  if.    if( p->op
1fe90 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
1fea0 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
1feb0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
1fec0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1fed0 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41  (.         "CREA
1fee0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1fef0 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69   zip USING zipfi
1ff00 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62  le(%Q);", p->zDb
1ff10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1ff20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1ff30 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
1ff40 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1ff50 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1ff60 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1ff70 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1ff80 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20  ALIZE.    else. 
1ff90 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f     if( p->openMo
1ffa0 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44  de==SHELL_OPEN_D
1ffb0 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d  ESERIALIZE || p-
1ffc0 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
1ffd0 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20  _OPEN_HEXDB ){. 
1ffe0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1fff0 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30     int nData = 0
20000 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
20010 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
20020 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
20030 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20040 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20  DESERIALIZE ){. 
20050 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 28         aData = (
20060 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72  unsigned char*)r
20070 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69  eadFile(p->zDbFi
20080 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b  lename, &nData);
20090 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
200a0 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 72 65        aData = re
200b0 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74  adHexDb(p, &nDat
200c0 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
200d0 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
200e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
200f0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
20100 20 69 6e 20 68 65 78 64 62 20 69 6e 70 75 74 5c   in hexdb input\
20110 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
20120 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
20130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
20140 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65  c = sqlite3_dese
20150 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22  rialize(p->db, "
20160 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44  main", aData, nD
20170 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20  ata, nData,.    
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
20190 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a  QLITE_DESERIALIZ
201a0 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20  E_RESIZEABLE |. 
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41    SQLITE_DESERIA
201d0 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45  LIZE_FREEONCLOSE
201e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
201f0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
20200 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20210 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64  Error: sqlite3_d
20220 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74  eserialize() ret
20230 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
20240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20250 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20 29 7b  f( p->szMax>0 ){
20260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20270 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
20280 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  >db, "main", SQL
20290 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 4c  ITE_FCNTL_SIZE_L
202a0 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61 78 29  IMIT, &p->szMax)
202b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
202c0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
202d0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63  .** Attempt to c
202e0 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 65  lose the databae
202f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52  s connection.  R
20300 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f  eport errors..*/
20310 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62 28 73  .void close_db(s
20320 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
20330 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
20340 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69 66 28  close(db);.  if(
20350 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
20360 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20370 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63  Error: sqlite3_c
20380 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73 20 25  lose() returns %
20390 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  d: %s\n",.      
203a0 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f 65 72    rc, sqlite3_er
203b0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a  rmsg(db));.  } .
203c0 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44  }..#if HAVE_READ
203d0 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44 49  LINE || HAVE_EDI
203e0 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64  TLINE./*.** Read
203f0 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  line completion 
20400 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61  callbacks.*/.sta
20410 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 6c 69  tic char *readli
20420 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65  ne_completion_ge
20430 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20 63 68  nerator(const ch
20440 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20 73 74  ar *text, int st
20450 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20 73  ate){.  static s
20460 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
20470 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
20480 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74 61 74  zRet;.  if( stat
20490 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  e==0 ){.    char
204a0 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69   *zSql;.    sqli
204b0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
204c0 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  mt);.    zSql = 
204d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
204e0 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
204f0 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41   candidate COLLA
20500 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20  TE nocase".     
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f        "  FROM co
20530 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52 44  mpletion(%Q) ORD
20540 45 52 20 42 59 20 31 22 2c 20 74 65 78 74 29 3b  ER BY 1", text);
20550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
20560 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62  pare_v2(globalDb
20570 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
20580 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
20590 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
205a0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
205b0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
205c0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
205d0 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70 28 28   zRet = strdup((
205e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
205f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
20600 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65  pStmt, 0));.  }e
20610 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
20620 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
20630 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
20640 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20  .    zRet = 0;. 
20650 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
20660 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20  ;.}.static char 
20670 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c  **readline_compl
20680 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  etion(const char
20690 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 53 74   *zText, int iSt
206a0 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a  art, int iEnd){.
206b0 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63    rl_attempted_c
206c0 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d  ompletion_over =
206d0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f   1;.  return rl_
206e0 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68  completion_match
206f0 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64 6c 69  es(zText, readli
20700 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65  ne_completion_ge
20710 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c  nerator);.}..#el
20720 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53  if HAVE_LINENOIS
20730 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73  E./*.** Linenois
20740 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
20750 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  lback.*/.static 
20760 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63  void linenoise_c
20770 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
20780 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e  char *zLine, lin
20790 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e  enoiseCompletion
207a0 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c  s *lc){.  int nL
207b0 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ine = strlen30(z
207c0 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20  Line);.  int i, 
207d0 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65  iStart;.  sqlite
207e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
207f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
20800 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
20810 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65  0];..  if( nLine
20820 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30  >sizeof(zBuf)-30
20830 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20840 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c   zLine[0]=='.' |
20850 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29  | zLine[0]=='#')
20860 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
20870 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26  =nLine-1; i>=0 &
20880 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65  & (isalnum(zLine
20890 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d  [i]) || zLine[i]
208a0 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20  =='_'); i--){}. 
208b0 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20   if( i==nLine-1 
208c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61  ) return;.  iSta
208d0 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63  rt = i+1;.  memc
208e0 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20  py(zBuf, zLine, 
208f0 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20  iStart);.  zSql 
20900 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20910 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
20920 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
20930 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f        "  FROM co
20960 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20  mpletion(%Q,%Q) 
20970 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20  ORDER BY 1",.   
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74        &zLine[iSt
209a0 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  art], zLine);.  
209b0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
209c0 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71  v2(globalDb, zSq
209d0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
209e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
209f0 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
20a00 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62  e3_exec(globalDb
20a10 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63  , "PRAGMA page_c
20a20 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ount", 0, 0, 0);
20a30 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68   /* Load the sch
20a40 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ema */.  while( 
20a50 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
20a60 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
20a70 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20a80 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d  r *zCompletion =
20a90 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20aa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20ab0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
20ac0 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e   int nCompletion
20ad0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20ae0 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30  n_bytes(pStmt, 0
20af0 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61 72  );.    if( iStar
20b00 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20  t+nCompletion < 
20b10 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29  sizeof(zBuf)-1 )
20b20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  {.      memcpy(z
20b30 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d  Buf+iStart, zCom
20b40 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65  pletion, nComple
20b50 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c  tion+1);.      l
20b60 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c  inenoiseAddCompl
20b70 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b  etion(lc, zBuf);
20b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
20b90 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
20ba0 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tmt);.}.#endif..
20bb0 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75  /*.** Do C-langu
20bc0 61 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74  age style dequot
20bd0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61  ing..**.**    \a
20be0 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20      -> alarm.** 
20bf0 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b     \b    -> back
20c00 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20  space.**    \t  
20c10 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c    -> tab.**    \
20c20 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a  n    -> newline.
20c30 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76  **    \v    -> v
20c40 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20  ertical tab.**  
20c50 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20    \f    -> form 
20c60 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20  feed.**    \r   
20c70 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74   -> carriage ret
20c80 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20  urn.**    \s    
20c90 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c  -> space.**    \
20ca0 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20  "    -> ".**    
20cb0 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20  \'    -> '.**   
20cc0 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c   \\    -> backsl
20cd0 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20  ash.**    \NNN  
20ce0 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74  -> ascii charact
20cf0 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a  er NNN in octal.
20d00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
20d10 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
20d20 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  es(char *z){.  i
20d30 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
20d40 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26  c;.  while( *z &
20d50 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b  & *z!='\\' ) z++
20d60 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28  ;.  for(i=j=0; (
20d70 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
20d80 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, j++){.    if(
20d90 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b   c=='\\' && z[i+
20da0 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  1]!=0 ){.      c
20db0 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20   = z[++i];.     
20dc0 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20   if( c=='a' ){. 
20dd0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b         c = '\a';
20de0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20df0 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20   c=='b' ){.     
20e00 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20     c = '\b';.   
20e10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
20e20 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  't' ){.        c
20e30 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d   = '\t';.      }
20e40 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20  else if( c=='n' 
20e50 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
20e60 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
20e70 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20   if( c=='v' ){. 
20e80 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b         c = '\v';
20e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20ea0 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20   c=='f' ){.     
20eb0 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20     c = '\f';.   
20ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
20ed0 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'r' ){.        c
20ee0 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d   = '\r';.      }
20ef0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
20f00 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
20f10 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  "';.      }else 
20f20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
20f30 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b         c = '\'';
20f40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20f50 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
20f60 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20      c = '\\';.  
20f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
20f80 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29  ='0' && c<='7' )
20f90 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27  {.        c -= '
20fa0 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
20fb0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
20fc0 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
20fd0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
20fe0 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33         c = (c<<3
20ff0 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a  ) + z[i] - '0';.
21000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
21010 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69  i+1]>='0' && z[i
21020 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  +1]<='7' ){.    
21030 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
21040 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
21050 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
21060 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21080 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
21090 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c   c;.  }.  if( j<
210a0 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a  i ) z[j] = 0;.}.
210b0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
210c0 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20   zArg as either 
210d0 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20  an integer or a 
210e0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
210f0 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a  Return 1 or 0.**
21100 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41   for TRUE and FA
21110 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  LSE.  Return the
21120 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
21130 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  f appropriate..*
21140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f  /.static int boo
21150 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20  leanValue(const 
21160 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69  char *zArg){.  i
21170 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67  nt i;.  if( zArg
21180 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
21190 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
211a0 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69  for(i=2; hexDigi
211b0 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e  tValue(zArg[i])>
211c0 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c  =0; i++){}.  }el
211d0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
211e0 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26   zArg[i]>='0' &&
211f0 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69   zArg[i]<='9'; i
21200 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++){}.  }.  if( 
21210 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d  i>0 && zArg[i]==
21220 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29  0 ) return (int)
21230 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41  (integerValue(zA
21240 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66  rg) & 0xffffffff
21250 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
21260 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
21270 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  on")==0 || sqlit
21280 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
21290 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "yes")==0 ){.   
212a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
212b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
212c0 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22  icmp(zArg, "off"
212d0 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
212e0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f  stricmp(zArg,"no
212f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
21300 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66  urn 0;.  }.  utf
21310 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21320 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62   "ERROR: Not a b
21330 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22  oolean value: \"
21340 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c  %s\". Assuming \
21350 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20  "no\".\n",.     
21360 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72 65       zArg);.  re
21370 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
21380 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
21390 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72  shell flag accor
213a0 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61  ding to a boolea
213b0 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  n value..*/.stat
213c0 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c 65  ic void setOrCle
213d0 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61 74  arFlag(ShellStat
213e0 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d  e *p, unsigned m
213f0 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61 72  Flag, const char
21400 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 62   *zArg){.  if( b
21410 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72 67  ooleanValue(zArg
21420 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65  ) ){.    ShellSe
21430 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b  tFlag(p, mFlag);
21440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68  .  }else{.    Sh
21450 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  ellClearFlag(p, 
21460 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mFlag);.  }.}../
21470 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75  *.** Close an ou
21480 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d  tput file, assum
21490 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74  ing it is not st
214a0 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a  derr or stdout.*
214b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
214c0 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
214d0 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20  FILE *f){.  if( 
214e0 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26  f && f!=stdout &
214f0 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66 63  & f!=stderr ) fc
21500 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  lose(f);.}../*.*
21510 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e  * Try to open an
21520 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20   output file.   
21530 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75  The names "stdou
21540 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22 20  t" and "stderr" 
21550 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  are.** recognize
21560 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67  d and do the rig
21570 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20  ht thing.  NULL 
21580 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
21590 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c  he output.** fil
215a0 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a  ename is "off"..
215b0 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  */.static FILE *
215c0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
215d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
215e0 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f 64  le, int bTextMod
215f0 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20  e){.  FILE *f;. 
21600 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
21610 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29  e,"stdout")==0 )
21620 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74  {.    f = stdout
21630 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
21640 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64  rcmp(zFile, "std
21650 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  err")==0 ){.    
21660 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65  f = stderr;.  }e
21670 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
21680 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20  File, "off")==0 
21690 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20  ){.    f = 0;.  
216a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66  }else{.    f = f
216b0 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78  open(zFile, bTex
216c0 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20 22 77  tMode ? "w" : "w
216d0 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d  b");.    if( f==
216e0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
216f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21700 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
21710 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
21720 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
21730 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23    return f;.}..#
21740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21750 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 41  IT_TRACE./*.** A
21760 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e   routine for han
21770 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f  dling output fro
21780 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  m sqlite3_trace(
21790 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
217a0 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62   sql_trace_callb
217b0 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ack(.  unsigned 
217c0 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  mType,         /
217d0 2a 20 54 68 65 20 74 72 61 63 65 20 74 79 70 65  * The trace type
217e0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
217f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
21800 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20   The ShellState 
21810 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f 69  pointer */.  voi
21820 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20 20 20  d *pP,          
21830 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20       /* Usually 
21840 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  a pointer to sql
21850 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20 76 6f  ite_stmt */.  vo
21860 69 64 20 2a 70 58 20 20 20 20 20 20 20 20 20 20  id *pX          
21870 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c 69 61        /* Auxilia
21880 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a  ry output */.){.
21890 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
218a0 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
218b0 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  Arg;.  sqlite3_s
218c0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f  tmt *pStmt;.  co
218d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
218e0 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20 69 66    int nSql;.  if
218f0 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30  ( p->traceOut==0
21900 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21910 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( mType==SQLITE
21920 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a  _TRACE_CLOSE ){.
21930 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
21940 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 2d 2d  p->traceOut, "--
21950 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61 73   closing databas
21960 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22 29  e connection\n")
21970 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
21980 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70 65 21    }.  if( mType!
21990 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f  =SQLITE_TRACE_RO
219a0 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63 68 61  W && ((const cha
219b0 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27 20 29  r*)pX)[0]=='-' )
219c0 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f  {.    zSql = (co
219d0 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20  nst char*)pX;.  
219e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d 74  }else{.    pStmt
219f0 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74   = (sqlite3_stmt
21a00 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74 63 68  *)pP;.    switch
21a10 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70 65 20  ( p->eTraceType 
21a20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  ){.      case SH
21a30 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e 44  ELL_TRACE_EXPAND
21a40 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53  ED: {.        zS
21a50 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
21a60 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29  anded_sql(pStmt)
21a70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
21a80 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
21a90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
21aa0 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 63 61  RMALIZE.      ca
21ab0 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e  se SHELL_TRACE_N
21ac0 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ORMALIZED: {.   
21ad0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
21ae0 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73  te3_normalized_s
21af0 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
21b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21b10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
21b20 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
21b30 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
21b40 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
21b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21b60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21b70 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
21b80 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c 20 3d  turn 0;.  nSql =
21b90 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
21ba0 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c 3e 30  .  while( nSql>0
21bb0 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31 5d   && zSql[nSql-1]
21bc0 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d 3b  ==';' ){ nSql--;
21bd0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d 54 79   }.  switch( mTy
21be0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
21bf0 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 3a  QLITE_TRACE_ROW:
21c00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21c10 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20  _TRACE_STMT: {. 
21c20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
21c30 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25  (p->traceOut, "%
21c40 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a  .*s;\n", nSql, z
21c50 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Sql);.      brea
21c60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21c70 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50  e SQLITE_TRACE_P
21c80 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  ROFILE: {.      
21c90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e  sqlite3_int64 nN
21ca0 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c 69 74  anosec = *(sqlit
21cb0 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a 20 20  e3_int64*)pX;.  
21cc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
21cd0 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e  p->traceOut, "%.
21ce0 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c 6e  *s; -- %lld ns\n
21cf0 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e  ", nSql, zSql, n
21d00 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20 20 20  Nanosec);.      
21d10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
21d20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
21d30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e  endif../*.** A n
21d40 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61  o-op routine tha
21d50 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20  t runs with the 
21d60 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f  ".breakpoint" do
21d70 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73  c-command.  This
21d80 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20   is.** a useful 
21d90 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65  spot to set a de
21da0 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
21db0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
21dc0 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
21dd0 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
21de0 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b  c int nCall = 0;
21df0 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f  .  nCall++;.}../
21e00 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75  *.** An object u
21e10 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53  sed to read a CS
21e20 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65  V and other file
21e30 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f  s for import..*/
21e40 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
21e50 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74  ImportCtx Import
21e60 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f  Ctx;.struct Impo
21e70 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20  rtCtx {.  const 
21e80 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a  char *zFile;  /*
21e90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   Name of the inp
21ea0 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c  ut file */.  FIL
21eb0 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
21ec0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56   /* Read the CSV
21ed0 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20   text from this 
21ee0 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  input stream */.
21ef0 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
21f00 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c        /* Accumul
21f10 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20  ated text for a 
21f20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
21f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
21f50 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20  s in z */.  int 
21f60 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
21f70 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
21f80 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20  ed for z[] */.  
21f90 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20  int nLine;      
21fa0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
21fb0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
21fc0 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20  int bNotFirst;  
21fd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
21fe0 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  ne or more bytes
21ff0 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f   already read */
22000 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20  .  int cTerm;   
22010 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63         /* Charac
22020 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
22030 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ted the most rec
22040 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  ent field */.  i
22050 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20  nt cColSep;     
22060 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
22070 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
22080 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20  cter.  (Usually 
22090 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52  ",") */.  int cR
220a0 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a  owSep;        /*
220b0 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   The row separat
220c0 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28  or character.  (
220d0 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f  Usually "\n") */
220e0 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61  .};../* Append a
220f0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
22100 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  z[] */.static vo
22110 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64  id import_append
22120 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20  _char(ImportCtx 
22130 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66  *p, int c){.  if
22140 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c  ( p->n+1>=p->nAl
22150 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  loc ){.    p->nA
22160 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f  lloc += p->nAllo
22170 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e  c + 100;.    p->
22180 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  z = sqlite3_real
22190 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e  loc64(p->z, p->n
221a0 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
221b0 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  p->z==0 ) shell_
221c0 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
221d0 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e  .  }.  p->z[p->n
221e0 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d  ++] = (char)c;.}
221f0 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
22200 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20  le field of CSV 
22210 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c  text.  Compatibl
22220 65 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61  e with rfc4180 a
22230 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77  nd extended.** w
22240 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f  ith the option o
22250 66 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72  f having a separ
22260 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
22270 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20  ","..**.**   +  
22280 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d  Input comes from
22290 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20   p->in..**   +  
222a0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
222b0 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20   p->z of length 
222c0 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  p->n.  Space to 
222d0 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a  hold p->z comes.
222e0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c  **      from sql
222f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e  ite3_malloc64().
22300 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
22310 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75  cSep as the colu
22320 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  mn separator.  T
22330 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c  he default is ",
22340 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
22350 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
22360 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
22370 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e  e default is "\n
22380 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
22390 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
223a0 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e  e number in p->n
223b0 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  Line..**   +  St
223c0 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65  ore the characte
223d0 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  r that terminate
223e0 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70  s the field in p
223f0 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a  ->cTerm.  Store.
22400 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65  **      EOF on e
22410 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20  nd-of-file..**  
22420 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61   +  Report synta
22430 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65  x errors on stde
22440 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  rr.*/.static cha
22450 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  r *SQLITE_CDECL 
22460 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
22470 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29  ld(ImportCtx *p)
22480 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
22490 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53   cSep = p->cColS
224a0 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d  ep;.  int rSep =
224b0 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70   p->cRowSep;.  p
224c0 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66  ->n = 0;.  c = f
224d0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69  getc(p->in);.  i
224e0 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65  f( c==EOF || see
224f0 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  nInterrupt ){.  
22500 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46    p->cTerm = EOF
22510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
22520 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27    }.  if( c=='"'
22530 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20   ){.    int pc, 
22540 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  ppc;.    int sta
22550 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e  rtLine = p->nLin
22560 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74  e;.    int cQuot
22570 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20  e = c;.    pc = 
22580 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  ppc = 0;.    whi
22590 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63  le( 1 ){.      c
225a0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
225b0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53  .      if( c==rS
225c0 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b  ep ) p->nLine++;
225d0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51  .      if( c==cQ
225e0 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
225f0 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29  if( pc==cQuote )
22600 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  {.          pc =
22610 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   0;.          co
22620 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22630 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
22640 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20  if( (c==cSep && 
22650 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
22660 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26     || (c==rSep &
22670 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
22680 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70       || (c==rSep
22690 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20   && pc=='\r' && 
226a0 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20  ppc==cQuote).   
226b0 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26      || (c==EOF &
226c0 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
226d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64      ){.        d
226e0 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c  o{ p->n--; }whil
226f0 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63  e( p->z[p->n]!=c
22700 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20  Quote );.       
22710 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
22720 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22730 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22740 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21  pc==cQuote && c!
22750 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\r' ){.       
22760 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22770 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65  err, "%s:%d: une
22780 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63  scaped %c charac
22790 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ter\n",.        
227a0 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65          p->zFile
227b0 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f  , p->nLine, cQuo
227c0 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  te);.      }.   
227d0 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b     if( c==EOF ){
227e0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
227f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
22800 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65  :%d: unterminate
22810 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c  d %c-quoted fiel
22820 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
22830 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20        p->zFile, 
22840 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74  startLine, cQuot
22850 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  e);.        p->c
22860 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20  Term = c;.      
22870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22880 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  .      import_ap
22890 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
228a0 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b  .      ppc = pc;
228b0 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20  .      pc = c;. 
228c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
228d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
228e0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
228f0 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64  being parsed and
22900 20 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20   it begins with 
22910 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38  the.    ** UTF-8
22920 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42   BOM  (0xEF BB B
22930 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  F) then skip the
22940 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20   BOM */.    if( 
22950 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26  (c&0xff)==0xef &
22960 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d  & p->bNotFirst==
22970 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72  0 ){.      impor
22980 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
22990 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66   c);.      c = f
229a0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
229b0 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
229c0 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20  =0xbb ){.       
229d0 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
229e0 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
229f0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
22a00 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  in);.        if(
22a10 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20   (c&0xff)==0xbf 
22a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
22a30 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20  bNotFirst = 1;. 
22a40 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20           p->n = 
22a50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0;.          ret
22a60 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  urn csv_read_one
22a70 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20  _field(p);.     
22a80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22a90 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21   }.    while( c!
22aa0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
22ab0 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
22ac0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
22ad0 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
22ae0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
22af0 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >in);.    }.    
22b00 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20  if( c==rSep ){. 
22b10 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b       p->nLine++;
22b20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e  .      if( p->n>
22b30 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31  0 && p->z[p->n-1
22b40 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d  ]=='\r' ) p->n--
22b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63  ;.    }.    p->c
22b60 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  Term = c;.  }.  
22b70 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
22b80 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e  p->n] = 0;.  p->
22b90 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20  bNotFirst = 1;. 
22ba0 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
22bb0 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
22bc0 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49  e field of ASCII
22bd0 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e   delimited text.
22be0 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75  .**.**   +  Inpu
22bf0 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e  t comes from p->
22c00 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  in..**   +  Stor
22c10 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e  e results in p->
22c20 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e  z of length p->n
22c30 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
22c40 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20   p->z comes.**  
22c50 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33      from sqlite3
22c60 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20  _malloc64()..** 
22c70 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70    +  Use p->cSep
22c80 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73   as the column s
22c90 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
22ca0 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22  efault is "\x1F"
22cb0 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
22cc0 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
22cd0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
22ce0 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31   default is "\x1
22cf0 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70  E"..**   +  Keep
22d00 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f   track of the ro
22d10 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e  w number in p->n
22d20 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  Line..**   +  St
22d30 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65  ore the characte
22d40 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  r that terminate
22d50 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70  s the field in p
22d60 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a  ->cTerm.  Store.
22d70 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65  **      EOF on e
22d80 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20  nd-of-file..**  
22d90 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61   +  Report synta
22da0 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65  x errors on stde
22db0 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  rr.*/.static cha
22dc0 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  r *SQLITE_CDECL 
22dd0 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66  ascii_read_one_f
22de0 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a  ield(ImportCtx *
22df0 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  p){.  int c;.  i
22e00 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f  nt cSep = p->cCo
22e10 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70  lSep;.  int rSep
22e20 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20   = p->cRowSep;. 
22e30 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
22e40 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
22e50 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
22e60 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
22e70 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
22e80 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
22e90 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63  ;.  }.  while( c
22ea0 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70  !=EOF && c!=cSep
22eb0 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20   && c!=rSep ){. 
22ec0 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
22ed0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
22ee0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
22ef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d  );.  }.  if( c==
22f00 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  rSep ){.    p->n
22f10 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  Line++;.  }.  p-
22f20 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66  >cTerm = c;.  if
22f30 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d  ( p->z ) p->z[p-
22f40 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  >n] = 0;.  retur
22f50 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n p->z;.}../*.**
22f60 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72   Try to transfer
22f70 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
22f80 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65  zTable.  If an e
22f90 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69  rror is seen whi
22fa0 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72  le.** moving for
22fb0 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20  ward, try to go 
22fc0 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20  backwards.  The 
22fd0 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65  backwards moveme
22fe0 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b  nt won't.** work
22ff0 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
23000 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  ID tables..*/.st
23010 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
23020 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c  loneData(.  Shel
23030 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c  lState *p,.  sql
23040 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63  ite3 *newDb,.  c
23050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
23060 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  e.){.  sqlite3_s
23070 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
23080 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
23090 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20  *pInsert = 0;.  
230a0 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
230b0 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72  ;.  char *zInser
230c0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
230d0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
230e0 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73    int nTable = s
230f0 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b  trlen30(zTable);
23100 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20  .  int k = 0;.  
23110 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63  int cnt = 0;.  c
23120 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74  onst int spinRat
23130 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51  e = 10000;..  zQ
23140 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
23150 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
23160 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a   FROM \"%w\"", z
23170 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73  Table);.  rc = s
23180 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
23190 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  2(p->db, zQuery,
231a0 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29   -1, &pQuery, 0)
231b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
231c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
231d0 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
231e0 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
231f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23200 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
23210 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
23220 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
23230 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
23240 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74  zQuery);.    got
23250 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
23260 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74  .  }.  n = sqlit
23270 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
23280 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65  pQuery);.  zInse
23290 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  rt = sqlite3_mal
232a0 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62  loc64(200 + nTab
232b0 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28  le + n*3);.  if(
232c0 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68   zInsert==0 ) sh
232d0 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
232e0 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  y();.  sqlite3_s
232f0 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62  nprintf(200+nTab
23300 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20  le,zInsert,.    
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23320 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
23330 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c   INTO \"%s\" VAL
23340 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b  UES(?", zTable);
23350 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  i = strlen30(
23360 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28  zInsert);.  for(
23370 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a  j=1; j<n; j++){.
23380 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65      memcpy(zInse
23390 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a  rt+i, ",?", 2);.
233a0 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a      i += 2;.  }.
233b0 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
233c0 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20  +i, ");", 3);.  
233d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
233e0 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a  pare_v2(newDb, z
233f0 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e  Insert, -1, &pIn
23400 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  sert, 0);.  if( 
23410 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
23420 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
23430 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b  rror %d: %s on [
23440 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
23450 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
23460 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
23470 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Db), sqlite3_err
23480 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  msg(newDb),.    
23490 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
234a0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61  .    goto end_da
234b0 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66  ta_xfer;.  }.  f
234c0 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b  or(k=0; k<2; k++
234d0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72  ){.    while( (r
234e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
234f0 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
23500 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66  E_ROW ){.      f
23510 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
23520 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  ){.        switc
23530 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
23540 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69  n_type(pQuery, i
23550 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
23560 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
23570 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
23580 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
23590 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a  (pInsert, i+1);.
235a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
235b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
235c0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
235d0 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
235e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
235f0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
23600 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
23610 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
23620 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  4(pQuery,i));.  
23630 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23650 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
23660 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
23670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23680 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73  bind_double(pIns
23690 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
236a0 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
236b0 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
236c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
236d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
236e0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
236f0 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20  _TEXT: {.       
23700 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
23710 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20  d_text(pInsert, 
23720 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  i+1,.           
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73    (const char*)s
23750 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
23760 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  xt(pQuery,i),.  
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
23790 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
237a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
237b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
237c0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
237d0 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
237e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
237f0 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72  bind_blob(pInser
23800 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
23810 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65  column_blob(pQue
23820 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
23860 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69  n_bytes(pQuery,i
23870 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
238a0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
238b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
238c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
238d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
238e0 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20  /* End for */.  
238f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23900 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a  _step(pInsert);.
23910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23920 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
23930 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21  QLITE_ROW && rc!
23940 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
23950 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
23960 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
23970 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71  or %d: %s\n", sq
23980 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
23990 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20  rrcode(newDb),. 
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
239c0 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
239d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
239e0 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
239f0 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  rt);.      cnt++
23a00 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74  ;.      if( (cnt
23a10 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b  %spinRate)==0 ){
23a20 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
23a30 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b  "%c\b", "|/-\\"[
23a40 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34  (cnt/spinRate)%4
23a50 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75  ]);.        fflu
23a60 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
23a70 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64    }.    } /* End
23a80 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66   while */.    if
23a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
23aa0 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  E ) break;.    s
23ab0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
23ac0 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
23ad0 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
23ae0 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20  );.    zQuery = 
23af0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
23b00 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
23b10 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72  "%w\" ORDER BY r
23b20 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20  owid DESC;",.   
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65            zTable
23b50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
23b60 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
23b70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
23b80 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
23b90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23ba0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
23bb0 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a  tderr, "Warning:
23bc0 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25   cannot step \"%
23bd0 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20  s\" backwards", 
23be0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  zTable);.      b
23bf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  reak;.    }.  } 
23c00 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e  /* End for(k=0..
23c10 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f  .) */..end_data_
23c20 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
23c30 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
23c40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
23c50 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20  lize(pInsert);. 
23c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
23c70 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
23c80 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a  _free(zInsert);.
23c90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
23ca0 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f   transfer all ro
23cb0 77 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ws of the schema
23cc0 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65   that match zWhe
23cd0 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68  re.  For.** each
23ce0 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f   row, invoke xFo
23cf0 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f  rEach() on the o
23d00 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79  bject defined by
23d10 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66   that row..** If
23d20 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
23d30 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d  ountered while m
23d40 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68  oving forward th
23d50 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c  rough the.** sql
23d60 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
23d70 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69  , try again movi
23d80 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f  ng backwards..*/
23d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
23da0 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20  ToCloneSchema(. 
23db0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
23dc0 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
23dd0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23de0 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28  zWhere,.  void (
23df0 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c  *xForEach)(Shell
23e00 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c  State*,sqlite3*,
23e10 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
23e20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
23e30 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68  pQuery = 0;.  ch
23e40 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a  ar *zQuery = 0;.
23e50 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
23e60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
23e70 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  *zName;.  const 
23e80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
23e90 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
23ea0 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75  rMsg = 0;..  zQu
23eb0 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
23ec0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61  rintf("SELECT na
23ed0 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  me, sql FROM sql
23ee0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
23f10 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72  s", zWhere);.  r
23f20 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23f30 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
23f40 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
23f50 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
23f60 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
23f70 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
23f80 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25  r: (%d) %s on [%
23f90 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
23fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23fb0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
23fc0 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
23fd0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
23fe0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
23ff0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
24000 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
24010 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ema_xfer;.  }.  
24020 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
24030 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79  ite3_step(pQuery
24040 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ))==SQLITE_ROW )
24050 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
24060 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24070 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
24080 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
24090 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
240a0 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69  ery, 1);.    pri
240b0 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e  ntf("%s... ", zN
240c0 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ame); fflush(std
240d0 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  out);.    sqlite
240e0 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63  3_exec(newDb, (c
240f0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c  onst char*)zSql,
24100 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
24110 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
24120 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
24130 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24140 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
24150 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
24160 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  , zSql);.      s
24170 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
24180 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72  Msg);.      zErr
24190 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Msg = 0;.    }. 
241a0 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
241b0 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63  ){.      xForEac
241c0 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e  h(p, newDb, (con
241d0 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b  st char*)zName);
241e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
241f0 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d  f("done\n");.  }
24200 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24210 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  E_DONE ){.    sq
24220 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
24230 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
24240 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
24250 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
24260 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24270 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c  SELECT name, sql
24280 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
24290 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44    " WHERE %s ORD
242c0 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
242d0 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ", zWhere);.    
242e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
242f0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
24300 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
24310 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ry, 0);.    if( 
24320 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rc ){.      utf8
24330 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24340 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
24350 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
24380 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
24390 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
243a0 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67  zQuery);.      g
243d0 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78  oto end_schema_x
243e0 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  fer;.    }.    w
243f0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
24400 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
24410 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
24420 0a 20 20 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 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
24460 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
24470 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20  pQuery, 1);.    
24480 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
24490 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
244a0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
244b0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
244c0 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
244d0 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  *)zSql, 0, 0, &z
244e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  ErrMsg);.      i
244f0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
24500 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
24510 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
24520 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c  : %s\nSQL: [%s]\
24530 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71  n", zErrMsg, zSq
24540 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
24550 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
24560 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d  );.        zErrM
24570 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
24580 20 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61        if( xForEa
24590 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46  ch ){.        xF
245a0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
245b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
245c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
245d0 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65      printf("done
245e0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
245f0 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a  end_schema_xfer:
24600 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
24610 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73  ize(pQuery);.  s
24620 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
24630 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ry);.}../*.** Op
24640 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
24650 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e  e file named "zN
24660 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72  ewDb".  Try to r
24670 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69  ecover as much i
24680 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73  nformation.** as
24690 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66   possible out of
246a0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
246b0 73 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20  se (which might 
246c0 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20  be corrupt) and 
246d0 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f  write it.** into
246e0 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74   zNewDb..*/.stat
246f0 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f  ic void tryToClo
24700 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ne(ShellState *p
24710 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
24720 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ewDb){.  int rc;
24730 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
24740 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63  b = 0;.  if( acc
24750 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30  ess(zNewDb,0)==0
24760 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
24770 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c  ntf(stderr, "Fil
24780 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  e \"%s\" already
24790 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65   exists.\n", zNe
247a0 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  wDb);.    return
247b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
247c0 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62  ite3_open(zNewDb
247d0 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28  , &newDb);.  if(
247e0 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
247f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24800 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75  Cannot create ou
24810 74 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25  tput database: %
24820 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
24830 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
24840 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73  (newDb));.  }els
24850 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  e{.    sqlite3_e
24860 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
24870 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
24880 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30  ma=ON;", 0, 0, 0
24890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
248a0 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49  xec(newDb, "BEGI
248b0 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30  N EXCLUSIVE;", 0
248c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79  , 0, 0);.    try
248d0 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
248e0 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74   newDb, "type='t
248f0 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f  able'", tryToClo
24900 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79  neData);.    try
24910 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
24920 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27   newDb, "type!='
24930 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20  table'", 0);.   
24940 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
24950 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20  wDb, "COMMIT;", 
24960 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
24970 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
24980 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
24990 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
249a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
249b0 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29   close_db(newDb)
249c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
249d0 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  e the output fil
249e0 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74  e back to stdout
249f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24a00 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67  ->doXdgOpen flag
24a10 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65   is set, that me
24a20 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20 77  ans the output w
24a30 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69  as being.** redi
24a40 72 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70  rected to a temp
24a50 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64  orary file named
24a60 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65   by p->zTempFile
24a70 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
24a80 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74  .** launch start
24a90 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f  /open/xdg-open o
24aa0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
24ab0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
24ac0 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73   void output_res
24ad0 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  et(ShellState *p
24ae0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66  ){.  if( p->outf
24af0 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23  ile[0]=='|' ){.#
24b00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24b10 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c  IT_POPEN.    pcl
24b20 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e  ose(p->out);.#en
24b30 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
24b40 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
24b50 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e  se(p->out);.#ifn
24b60 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
24b70 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28  E_SYSTEM.    if(
24b80 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b   p->doXdgOpen ){
24b90 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
24ba0 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d  r *zXdgOpenCmd =
24bb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
24bc0 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74 61 72  N32).      "star
24bd0 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  t";.#elif define
24be0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
24bf0 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65     "open";.#else
24c00 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e  .      "xdg-open
24c10 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ";.#endif.      
24c20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20  char *zCmd;.    
24c30 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33    zCmd = sqlite3
24c40 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73 22  _mprintf("%s %s"
24c50 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70  , zXdgOpenCmd, p
24c60 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
24c70 20 20 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a      if( system(z
24c80 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Cmd) ){.        
24c90 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24ca0 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73  rr, "Failed: [%s
24cb0 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20  ]\n", zCmd);.   
24cc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24cd0 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20  e3_free(zCmd);. 
24ce0 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50       outputModeP
24cf0 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  op(p);.      p->
24d00 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20  doXdgOpen = 0;. 
24d10 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
24d20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
24d30 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f  OHAVE_SYSTEM) */
24d40 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c  .  }.  p->outfil
24d50 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f  e[0] = 0;.  p->o
24d60 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a  ut = stdout;.}..
24d70 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c  /*.** Run an SQL
24d80 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74   command and ret
24d90 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69  urn the single i
24da0 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a  nteger result..*
24db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
24dc0 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  int(ShellState *
24dd0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
24de0 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql){.  sqlite3_
24df0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
24e00 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71  nt res = 0;.  sq
24e10 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
24e20 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
24e30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
24e40 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
24e50 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
24e60 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
24e70 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
24e80 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
24e90 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  mt,0);.  }.  sql
24ea0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
24eb0 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tmt);.  return r
24ec0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  es;.}../*.** Con
24ed0 76 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72  vert a 2-byte or
24ee0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
24ef0 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  an integer into 
24f00 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  a native integer
24f10 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
24f20 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65  ned int get2byte
24f30 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61  Int(unsigned cha
24f40 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *a){.  return 
24f50 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d  (a[0]<<8) + a[1]
24f60 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67  ;.}.static unsig
24f70 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65  ned int get4byte
24f80 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61  Int(unsigned cha
24f90 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *a){.  return 
24fa0 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b  (a[0]<<24) + (a[
24fb0 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c  1]<<16) + (a[2]<
24fc0 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f  <8) + a[3];.}../
24fd0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
24fe0 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66  ion of the ".inf
24ff0 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  o" command..**.*
25000 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
25010 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
25020 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
25030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25040 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d  hell_dbinfo_comm
25050 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  and(ShellState *
25060 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  p, int nArg, cha
25070 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74  r **azArg){.  st
25080 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
25090 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  t { const char *
250a0 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b  zName; int ofst;
250b0 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a   } aField[] = {.
250c0 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61       { "file cha
250d0 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20  nge counter:",  
250e0 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64  24  },.     { "d
250f0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
25100 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20  nt:",  28  },.  
25110 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70     { "freelist p
25120 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36  age count:",  36
25130 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
25140 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20  ema cookie:",   
25150 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20       40  },.    
25160 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61   { "schema forma
25170 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20  t:",        44  
25180 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75  },.     { "defau
25190 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c  lt cache size:",
251a0 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b     48  },.     {
251b0 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70   "autovacuum top
251c0 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c   root:",  52  },
251d0 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65  .     { "increme
251e0 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20  ntal vacuum:",  
251f0 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   64  },.     { "
25200 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c  text encoding:",
25210 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20          56  },. 
25220 20 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73      { "user vers
25230 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36  ion:",         6
25240 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70  0  },.     { "ap
25250 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20  plication id:", 
25260 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20        68  },.   
25270 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65    { "software ve
25280 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20  rsion:",     96 
25290 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69   },.  };.  stati
252a0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
252b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
252c0 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me; const char *
252d0 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d  zSql; } aQuery[]
252e0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d   = {.     { "num
252f0 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c  ber of tables:",
25300 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
25310 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
25320 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
25330 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  le'" },.     { "
25340 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65  number of indexe
25350 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
25360 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
25370 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
25380 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20  'index'" },.    
25390 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72   { "number of tr
253a0 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20  iggers:",.      
253b0 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
253c0 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
253d0 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20  type='trigger'" 
253e0 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65  },.     { "numbe
253f0 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20  r of views:",.  
25400 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
25410 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
25420 45 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22  ERE type='view'"
25430 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
25440 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20  ma size:",.     
25450 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28    "SELECT total(
25460 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f  length(sql)) FRO
25470 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20  M %s" },.  };.  
25480 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75 6e 73  int i, rc;.  uns
25490 69 67 6e 65 64 20 69 44 61 74 61 56 65 72 73 69  igned iDataVersi
254a0 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68  on;.  char *zSch
254b0 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a  emaTab;.  char *
254c0 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  zDb = nArg>=2 ? 
254d0 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e  azArg[1] : "main
254e0 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
254f0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
25500 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48  unsigned char aH
25510 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f  dr[100];.  open_
25520 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  db(p, 0);.  if( 
25530 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  p->db==0 ) retur
25540 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n 1;.  rc = sqli
25550 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
25560 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
25570 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 61 20     "SELECT data 
25580 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61  FROM sqlite_dbpa
25590 67 65 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e  ge(?1) WHERE pgn
255a0 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o=1",.          
255b0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
255c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
255d0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
255e0 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
255f0 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50 41 47  ed("ENABLE_DBPAG
25600 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20 20 20  E_VTAB") ){.    
25610 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25620 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e 64 62  derr, "the \".db
25630 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64 20 72  info\" command r
25640 65 71 75 69 72 65 73 20 74 68 65 20 22 0a 20 20  equires the ".  
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c 49 54          "-DSQLIT
25670 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
25680 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  VTAB compile-tim
25690 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b 0a 20  e options\n");. 
256a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
256b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
256c0 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73 5c 6e  rr, "error: %s\n
256d0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
256e0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d  g(p->db));.    }
256f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
25700 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
25710 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25720 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
25730 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44  ext(pStmt, 1, zD
25740 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  b, -1, SQLITE_ST
25750 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c  ATIC);.  if( sql
25760 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
25770 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20  ==SQLITE_ROW.   
25780 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  && sqlite3_colum
25790 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29  n_bytes(pStmt,0)
257a0 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65  >100.  ){.    me
257b0 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74  mcpy(aHdr, sqlit
257c0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
257d0 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20  Stmt,0), 100);. 
257e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
257f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65  ize(pStmt);.  }e
25800 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
25810 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61  ntf(stderr, "una
25820 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74 61  ble to read data
25830 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b  base header\n");
25840 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
25850 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
25860 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25870 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e    i = get2byteIn
25880 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66  t(aHdr+16);.  if
25890 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35  ( i==1 ) i = 655
258a0 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  36;.  utf8_print
258b0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
258c0 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73   %d\n", "databas
258d0 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69  e page size:", i
258e0 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
258f0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
25900 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f  %d\n", "write fo
25910 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d  rmat:", aHdr[18]
25920 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
25930 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
25940 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72  %d\n", "read for
25950 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29  mat:", aHdr[19])
25960 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
25970 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
25980 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20  d\n", "reserved 
25990 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30  bytes:", aHdr[20
259a0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
259b0 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c  <ArraySize(aFiel
259c0 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  d); i++){.    in
259d0 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b  t ofst = aField[
259e0 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73  i].ofst;.    uns
259f0 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20  igned int val = 
25a00 67 65 74 34 62 79 74 65 49 6e 74 28 61 48 64 72  get4byteInt(aHdr
25a10 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74   + ofst);.    ut
25a20 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
25a30 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46  , "%-20s %u", aF
25a40 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76  ield[i].zName, v
25a50 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  al);.    switch(
25a60 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63   ofst ){.      c
25a70 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20  ase 56: {.      
25a80 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72    if( val==1 ) r
25a90 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
25aa0 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20  , " (utf8)");.  
25ab0 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32        if( val==2
25ac0 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
25ad0 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65  >out, " (utf16le
25ae0 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )");.        if(
25af0 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72   val==3 ) raw_pr
25b00 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28  intf(p->out, " (
25b10 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20  utf16be)");.    
25b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61    }.    }.    ra
25b30 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
25b40 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66   "\n");.  }.  if
25b50 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zDb==0 ){.    
25b60 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
25b70 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61  ite3_mprintf("ma
25b80 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in.sqlite_master
25b90 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
25ba0 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70  strcmp(zDb,"temp
25bb0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63  ")==0 ){.    zSc
25bc0 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65  hemaTab = sqlite
25bd0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
25be0 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
25bf0 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ter");.  }else{.
25c00 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
25c10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25c20 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f  ("\"%w\".sqlite_
25c30 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20  master", zDb);. 
25c40 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
25c50 41 72 72 61 79 53 69 7a 65 28 61 51 75 65 72 79  ArraySize(aQuery
25c60 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  ); i++){.    cha
25c70 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
25c80 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79  3_mprintf(aQuery
25c90 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d  [i].zSql, zSchem
25ca0 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76  aTab);.    int v
25cb0 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a  al = db_int(p, z
25cc0 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
25cd0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
25ce0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
25cf0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
25d00 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e  n", aQuery[i].zN
25d10 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20  ame, val);.  }. 
25d20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
25d30 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c  chemaTab);.  sql
25d40 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25d50 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51  l(p->db, zDb, SQ
25d60 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f  LITE_FCNTL_DATA_
25d70 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56  VERSION, &iDataV
25d80 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f  ersion);.  utf8_
25d90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
25da0 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61  %-20s %u\n", "da
25db0 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61  ta version", iDa
25dc0 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65  taVersion);.  re
25dd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25de0 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72 65   Print the curre
25df0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nt sqlite3_errms
25e00 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64  g() value to std
25e10 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31  err and return 1
25e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25e30 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
25e40 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  or(sqlite3 *db){
25e50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25e60 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
25e70 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38  rmsg(db);.  utf8
25e80 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
25e90 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
25ea0 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Err);.  return 1
25eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
25ec0 72 65 20 74 68 65 20 70 61 74 74 65 72 6e 20 69  re the pattern i
25ed0 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73  n zGlob[] agains
25ee0 74 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b  t the text in z[
25ef0 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a  ].  Return TRUE.
25f00 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63 68  ** if they match
25f10 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69   and FALSE (0) i
25f20 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
25f30 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62  tch..**.** Globb
25f40 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ing rules:.**.**
25f50 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20        '*'       
25f60 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
25f70 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
25f80 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e  more characters.
25f90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20  .**.**      '?' 
25fa0 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78        Matches ex
25fb0 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63  actly one charac
25fc0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ter..**.**     [
25fd0 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65  ...]      Matche
25fe0 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
25ff0 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65  from the enclose
26000 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20  d list of.**    
26010 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
26020 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
26030 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74    [^...]     Mat
26040 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
26050 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e  er not in the en
26060 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a  closed list..**.
26070 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20 20 20  **      '#'     
26080 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
26090 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72  quence of one or
260a0 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69 74   more digits wit
260b0 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  h an.**         
260c0 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20         optional 
260d0 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66  + or - sign in f
260e0 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ront.**.**      
260f0 27 20 27 20 20 20 20 20 20 20 41 6e 79 20 73 70  ' '       Any sp
26100 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63 65  an of whitespace
26110 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68   matches any oth
26120 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20  er span of.**   
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
26140 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45  tespace..**.** E
26150 78 74 72 61 20 77 68 69 74 65 73 70 61 63 65 20  xtra whitespace 
26160 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b  at the end of z[
26170 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  ] is ignored..*/
26180 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
26190 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20  case_glob(const 
261a0 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e  char *zGlob, con
261b0 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
261c0 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20  nt c, c2;.  int 
261d0 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65  invert;.  int se
261e0 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63  en;..  while( (c
261f0 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29   = (*(zGlob++)))
26200 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49  !=0 ){.    if( I
26210 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20  sSpace(c) ){.   
26220 20 20 20 69 66 28 20 21 49 73 53 70 61 63 65 28     if( !IsSpace(
26230 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
26240 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
26250 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a  pace(*zGlob) ) z
26260 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68  Glob++;.      wh
26270 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29  ile( IsSpace(*z)
26280 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73   ) z++;.    }els
26290 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a  e if( c=='*' ){.
262a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
262b0 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d  (*(zGlob++))) ==
262c0 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29   '*' || c=='?' )
262d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
262e0 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29  ='?' && (*(z++))
262f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
26300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26310 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
26320 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
26330 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
26340 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  [' ){.        wh
26350 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63  ile( *z && testc
26360 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31  ase_glob(zGlob-1
26370 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,z)==0 ){.      
26380 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20      z++;.       
26390 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
263a0 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20  n (*z)!=0;.     
263b0 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
263c0 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21  (c2 = (*(z++)))!
263d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  =0 ){.        wh
263e0 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20  ile( c2!=c ){.  
263f0 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
26400 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++);.          i
26410 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72  f( c2==0 ) retur
26420 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
26430 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63         if( testc
26440 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a  ase_glob(zGlob,z
26450 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
26460 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
26470 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
26480 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20  if( c=='?' ){.  
26490 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29      if( (*(z++))
264a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
264b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
264c0 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='[' ){.      in
264d0 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20  t prior_c = 0;. 
264e0 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20       seen = 0;. 
264f0 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
26500 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b  .      c = *(z++
26510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
26520 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26530 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
26540 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
26550 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20  2=='^' ){.      
26560 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20    invert = 1;.  
26570 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
26580 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
26590 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27       if( c2==']'
265a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
265b0 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20  c==']' ) seen = 
265c0 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
265d0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
265e0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
265f0 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29   c2 && c2!=']' )
26600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  {.        if( c2
26610 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  =='-' && zGlob[0
26620 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b  ]!=']' && zGlob[
26630 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63  0]!=0 && prior_c
26640 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
26650 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
26660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
26670 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
26680 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
26690 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
266a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
266b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
266c0 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
266d0 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
266e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
266f0 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
26700 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = c2;.        }.
26710 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
26720 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
26730 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30  .      if( c2==0
26740 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
26750 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rt)==0 ) return 
26760 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
26770 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c=='#' ){.     
26780 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20   if( (z[0]=='-' 
26790 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26  || z[0]=='+') &&
267a0 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29   IsDigit(z[1]) )
267b0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
267c0 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29  !IsDigit(z[0]) )
267d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
267e0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c   z++;.      whil
267f0 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  e( IsDigit(z[0])
26800 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d   ){ z++; }.    }
26810 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
26820 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65  c!=(*(z++)) ) re
26830 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
26840 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70 61  }.  while( IsSpa
26850 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  ce(*z) ){ z++; }
26860 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
26870 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
26880 72 65 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  re the string as
26890 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20   a command-line 
268a0 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68  option with eith
268b0 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a  er one or two.**
268c0 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61   initial "-" cha
268d0 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
268e0 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74  ic int optionMat
268f0 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
26900 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Str, const char 
26910 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53  *zOpt){.  if( zS
26920 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74  tr[0]!='-' ) ret
26930 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b  urn 0;.  zStr++;
26940 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d  .  if( zStr[0]==
26950 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20  '-' ) zStr++;.  
26960 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53  return strcmp(zS
26970 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a  tr, zOpt)==0;.}.
26980 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
26990 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65  file..*/.int she
269a0 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e  llDeleteFile(con
269b0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
269c0 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23  me){.  int rc;.#
269d0 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77  ifdef _WIN32.  w
269e0 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
269f0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
26a00 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  o_unicode(zFilen
26a10 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75  ame);.  rc = _wu
26a20 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69  nlink(z);.  sqli
26a30 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  te3_free(z);.#el
26a40 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b  se.  rc = unlink
26a50 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  (zFilename);.#en
26a60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
26a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
26a80 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
26a90 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66 20 74  orary file (if t
26aa0 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64  here is one) and
26ab0 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d   free the.** mem
26ac0 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  ory used to hold
26ad0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
26ae0 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73   temp file..*/.s
26af0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
26b00 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74  TempFile(ShellSt
26b10 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ate *p){.  if( p
26b20 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ->zTempFile==0 )
26b30 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
26b40 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65  ->doXdgOpen ) re
26b50 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c  turn;.  if( shel
26b60 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a  lDeleteFile(p->z
26b70 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75  TempFile) ) retu
26b80 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  rn;.  sqlite3_fr
26b90 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  ee(p->zTempFile)
26ba0 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ;.  p->zTempFile
26bb0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
26bc0 72 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70  reate a new temp
26bd0 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20   file name with 
26be0 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78  the given suffix
26bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26c00 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65   newTempFile(She
26c10 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
26c20 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29  t char *zSuffix)
26c30 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  {.  clearTempFil
26c40 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
26c50 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
26c60 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
26c70 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  le = 0;.  if( p-
26c80 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >db ){.    sqlit
26c90 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
26ca0 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45  p->db, 0, SQLITE
26cb0 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
26cc0 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69  AME, &p->zTempFi
26cd0 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
26ce0 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ->zTempFile==0 )
26cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69  {.    sqlite3_ui
26d00 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69  nt64 r;.    sqli
26d10 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
26d20 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
26d30 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20     p->zTempFile 
26d40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
26d50 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c  f("temp%llx.%s",
26d60 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20   r, zSuffix);.  
26d70 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54  }else{.    p->zT
26d80 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
26d90 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73  3_mprintf("%z.%s
26da0 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c  ", p->zTempFile,
26db0 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20   zSuffix);.  }. 
26dc0 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c   if( p->zTempFil
26dd0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  e==0 ){.    raw_
26de0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26df0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
26e00 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
26e10 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
26e20 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
26e30 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66   of SQL scalar f
26e40 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c  unction fkey_col
26e50 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75  late_clause(), u
26e60 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e  sed.** by the ".
26e70 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
26e80 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73  s" command. This
26e90 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
26ea0 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61   is always.** ca
26eb0 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20 61  lled with four a
26ec0 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70  rguments - the p
26ed0 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65  arent table name
26ee0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c  , the parent col
26ef0 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  umn name,.** the
26f00 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d   child table nam
26f10 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20  e and the child 
26f20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a  column name..**.
26f30 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74  **   fkey_collat
26f40 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74  e_clause('parent
26f50 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63  -tab', 'parent-c
26f60 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27  ol', 'child-tab'
26f70 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a  , 'child-col').*
26f80 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
26f90 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
26fa0 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f  es or columns do
26fb0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73   not exist, this
26fc0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
26fd0 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74  urns an empty st
26fe0 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73  ring. An empty s
26ff0 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65  tring is also re
27000 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74  turned if both t
27010 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c  ables.** and col
27020 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20 68  umns exist but h
27030 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65 66  ave the same def
27040 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
27050 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20  equence. Or,.** 
27060 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62 75  if both exist bu
27070 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  t the default co
27080 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
27090 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
270a0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
270b0 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  n returns the st
270c0 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c  ring " COLLATE <
270d0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
270e0 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61  >", where.** <pa
270f0 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20  rent-collation> 
27100 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
27110 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
27120 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
27130 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
27140 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79  c void shellFkey
27150 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20  CollateClause(. 
27160 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
27170 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56   *pCtx,.  int nV
27180 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
27190 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
271a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
271b0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
271c0 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a  b_handle(pCtx);.
271d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
271e0 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63  arent;.  const c
271f0 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b  har *zParentCol;
27200 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27210 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e  ParentSeq;.  con
27220 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b  st char *zChild;
27230 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27240 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73  ChildCol;.  cons
27250 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65  t char *zChildSe
27260 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69  q = 0;  /* Initi
27270 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66  alize to avoid f
27280 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61  alse-positive wa
27290 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72  rning */.  int r
272a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56  c;..  assert( nV
272b0 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65  al==4 );.  zPare
272c0 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  nt = (const char
272d0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
272e0 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
272f0 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28    zParentCol = (
27300 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
27310 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
27320 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69  pVal[1]);.  zChi
27330 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ld = (const char
27340 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
27350 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  text(apVal[2]);.
27360 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63    zChildCol = (c
27370 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27380 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
27390 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69  Val[3]);..  sqli
273a0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
273b0 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51  pCtx, "", -1, SQ
273c0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
273d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
273e0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
273f0 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d  ta(.      db, "m
27400 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a  ain", zParent, z
27410 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a  ParentCol, 0, &z
27420 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c  ParentSeq, 0, 0,
27430 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63   0.  );.  if( rc
27440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27460 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
27470 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64  adata(.        d
27480 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c  b, "main", zChil
27490 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c  d, zChildCol, 0,
274a0 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20   &zChildSeq, 0, 
274b0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
274c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
274d0 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
274e0 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53  stricmp(zParentS
274f0 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29  eq, zChildSeq) )
27500 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
27510 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27520 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a  " COLLATE %s", z
27530 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20  ParentSeq);.    
27540 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
27550 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c  ext(pCtx, z, -1,
27560 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
27570 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  T);.    sqlite3_
27580 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(z);.  }.}..
27590 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
275a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74  mentation of dot
275b0 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20  -command ".lint 
275c0 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a  fkey-indexes"..*
275d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
275e0 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20  tFkeyIndexes(.  
275f0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
27600 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
27610 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
27620 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
27630 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
27660 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
27670 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
27680 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
276b0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
276c0 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ] */.){.  sqlite
276d0 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e  3 *db = pState->
276e0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
276f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
27700 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20  query "main" db 
27710 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75  of */.  FILE *ou
27720 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
27730 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61          /* Strea
27740 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65  m to write non-e
27750 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a  rror output to *
27760 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  /.  int bVerbose
27770 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27780 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f      /* If -verbo
27790 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  se is present */
277a0 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50  .  int bGroupByP
277b0 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  arent = 0;      
277c0 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62     /* If -groupb
277d0 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73 65  yparent is prese
277e0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74          /* To it
27810 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a  erate through az
27820 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74  Arg[] */.  const
27830 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d   char *zIndent =
27840 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f   "";       /* Ho
27850 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74  w much to indent
27860 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 79   CREATE INDEX by
27870 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
278a0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
278b0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
278c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
278d0 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
278e0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
278f0 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  elow */..  /*.  
27900 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20 73  ** This SELECT s
27910 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
27920 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63   one row for eac
27930 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  h foreign key co
27940 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e  nstraint.  ** in
27950 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
27960 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
27970 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  . The column val
27980 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20  ues are:.  **.  
27990 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f  ** 0. The text o
279a0 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
279b0 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20  nt similar to:. 
279c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45   **.  **      "E
279d0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
279e0 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  N SELECT 1 FROM 
279f0 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52  child_table WHER
27a00 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20  E child_key=?". 
27a10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73   **.  **    This
27a20 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c   SELECT is simil
27a30 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68  ar to the one th
27a40 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
27a50 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  eys implementati
27a60 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73  on.  **    needs
27a70 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c   to run internal
27a80 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c  ly on child tabl
27a90 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
27aa0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  an index that ca
27ab0 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65  n.  **    be use
27ac0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  d to optimize th
27ad0 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
27ae0 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73  t can also be us
27af0 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a  ed by the FK.  *
27b00 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74  *    implementat
27b10 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  ion to optimize 
27b20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
27b30 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74   statements on t
27b40 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20  he parent.  **  
27b50 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20    table..  **.  
27b60 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74  ** 1. A GLOB pat
27b70 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f  tern suitable fo
27b80 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  r sqlite3_strglo
27b90 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e  b(). If the plan
27ba0 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20   output by.  ** 
27bb0 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51     the EXPLAIN Q
27bc0 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
27bd0 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20 70  d matches this p
27be0 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65  attern, then the
27bf0 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20   schema.  **    
27c00 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65  contains an inde
27c10 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  x that can be us
27c20 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
27c30 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  he query..  **. 
27c40 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61   ** 2. Human rea
27c50 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20  dable text that 
27c60 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63 68  describes the ch
27c70 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ild table and co
27c80 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a  lumns. e.g..  **
27c90 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69  .  **       "chi
27ca0 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b  ld_table(child_k
27cb0 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29  ey1, child_key2)
27cc0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48  ".  **.  ** 3. H
27cd0 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65  uman readable te
27ce0 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65  xt that describe
27cf0 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  s the parent tab
27d00 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
27d10 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
27d20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62       "parent_tab
27d30 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20  le(parent_key1, 
27d40 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20  parent_key2)".  
27d50 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c  **.  ** 4. A ful
27d60 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
27d70 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20  tatement for an 
27d80 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64  index that could
27d90 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
27da0 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c      optimize DEL
27db0 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74  ETE or UPDATE st
27dc0 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  atements on the 
27dd0 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e  parent table. e.
27de0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
27df0 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58     "CREATE INDEX
27e00 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69   child_table_chi
27e10 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f  ld_key ON child_
27e20 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29  table(child_key)
27e30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54  ".  **.  ** 5. T
27e40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
27e50 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a  arent table..  *
27e60 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78  *.  ** These six
27e70 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64   values are used
27e80 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20   by the C logic 
27e90 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74  below to generat
27ea0 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20  e the report..  
27eb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27ec0 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43  *zSql =.  "SELEC
27ed0 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 45  T ".    "     'E
27ee0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
27ef0 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  N SELECT 1 FROM 
27f00 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
27f10 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22  e) || ' WHERE '"
27f20 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70  .    "  || group
27f30 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e  _concat(quote(s.
27f40 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20  name) || '.' || 
27f50 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20  quote(f.[from]) 
27f60 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20  || '=?' ".    " 
27f70 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65   || fkey_collate
27f80 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20  _clause(".    " 
27f90 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c        f.[table],
27fa0 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d   COALESCE(f.[to]
27fb0 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e  , p.[name]), s.n
27fc0 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27  ame, f.[from]),'
27fd0 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20   AND ')".    ", 
27fe0 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41  ".    "     'SEA
27ff0 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73  RCH TABLE ' || s
28000 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47  .name || ' USING
28010 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a   COVERING INDEX*
28020 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72  ('".    "  || gr
28030 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27  oup_concat('*=?'
28040 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29  , ' AND ') || ')
28050 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
28060 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c  "     s.name  ||
28070 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f   '(' || group_co
28080 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20  ncat(f.[from],  
28090 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ', ') || ')'".  
280a0 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
280b0 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28   f.[table] || '(
280c0 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  ' || group_conca
280d0 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  t(COALESCE(f.[to
280e0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c  ], p.[name])) ||
280f0 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
28100 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45     "     'CREATE
28110 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74   INDEX ' || quot
28120 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c  e(s.name ||'_'||
28130 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
28140 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20  [from], '_'))". 
28150 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20     "  || ' ON ' 
28160 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
28170 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20   || '('".    "  
28180 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28190 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20  quote(f.[from]) 
281a0 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
281b0 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
281c0 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20  ause(".    "    
281d0 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c        f.[table],
281e0 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d   COALESCE(f.[to]
281f0 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e  , p.[name]), s.n
28200 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20  ame, f.[from]), 
28210 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c  ', ')".    "  ||
28220 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a   ');'".    ", ".
28230 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
28240 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20  le] ".    "FROM 
28250 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53  sqlite_master AS
28260 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69   s, pragma_forei
28270 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61  gn_key_list(s.na
28280 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22  me) AS f ".    "
28290 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61  LEFT JOIN pragma
282a0 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70  _table_info AS p
282b0 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e   ON (pk-1=seq AN
282c0 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65  D p.arg=f.[table
282d0 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20  ]) ".    "GROUP 
282e0 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20  BY s.name, f.id 
282f0 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20  ".    "ORDER BY 
28300 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45  (CASE WHEN ? THE
28310 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45  N f.[table] ELSE
28320 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20   s.name END)".  
28330 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
28340 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52  zGlobIPK = "SEAR
28350 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47  CH TABLE * USING
28360 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
28370 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b   KEY (rowid=?)";
28380 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e  ..  for(i=2; i<n
28390 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Arg; i++){.    i
283a0 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
283b0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69  azArg[i]);.    i
283c0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
283d0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72  3_strnicmp("-ver
283e0 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  bose", azArg[i],
283f0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
28400 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20  bVerbose = 1;.  
28410 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
28420 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
28430 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70  strnicmp("-group
28440 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67  byparent", azArg
28450 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
28460 20 20 20 20 62 47 72 6f 75 70 42 79 50 61 72 65      bGroupByPare
28470 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49  nt = 1;.      zI
28480 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a  ndent = "    ";.
28490 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
284a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
284b0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
284c0 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65   %s %s ?-verbose
284d0 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  ? ?-groupbyparen
284e0 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  t?\n",.         
284f0 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67   azArg[0], azArg
28500 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  [1].      );.   
28510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28520 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
28530 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
28540 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74   the fkey_collat
28550 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66  e_clause() SQL f
28560 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20  unction */.  rc 
28570 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
28580 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66  _function(db, "f
28590 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
285a0 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55  se", 4, SQLITE_U
285b0 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68  TF8,.      0, sh
285c0 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c  ellFkeyCollateCl
285d0 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  ause, 0, 0.  );.
285e0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
285f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
28600 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
28610 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
28620 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20  1, &pSql, 0);.  
28630 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
28640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
28650 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
28660 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50  ql, 1, bGroupByP
28670 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  arent);.  }..  i
28680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28690 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
286a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76  .    char *zPrev
286b0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
286c0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
286d0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
286e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  ){.      int res
286f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
28700 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
28710 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ain = 0;.      c
28720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20  onst char *zEQP 
28730 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
28740 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
28750 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  xt(pSql, 0);.   
28760 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
28770 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  Glob = (const ch
28780 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
28790 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
287a0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
287b0 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e  ar *zFrom = (con
287c0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
287d0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
287e0 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 2);.      con
287f0 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
28800 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
28810 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28820 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20  ext(pSql, 3);.  
28830 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28840 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zCI = (const cha
28850 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
28860 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b  n_text(pSql, 4);
28870 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
28880 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f  r *zParent = (co
28890 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
288a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
288b0 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72  ql, 5);..      r
288c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
288d0 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
288e0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
288f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
28900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
28910 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53  eak;.      if( S
28920 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
28930 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
28940 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
28950 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d  st char *zPlan =
28960 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
28970 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
28980 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
28990 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a          res = (.
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 3d                0=
289b0 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62  =sqlite3_strglob
289c0 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20  (zGlob, zPlan). 
289d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d            || 0==
289e0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
289f0 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29  zGlobIPK, zPlan)
28a00 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28a10 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
28a20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28a30 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
28a40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28a50 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  OK ) break;..   
28a60 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
28a70 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
28a80 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
28a90 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  r: internal erro
28aa0 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r");.        bre
28ab0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
28ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 47 72  .        if( bGr
28ad0 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20  oupByParent.    
28ae0 20 20 20 20 26 26 20 28 62 56 65 72 62 6f 73 65      && (bVerbose
28af0 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20   || res==0).    
28b00 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30      && (zPrev==0
28b10 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
28b20 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72  cmp(zParent, zPr
28b30 65 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ev)).        ){.
28b40 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
28b50 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61  intf(out, "-- Pa
28b60 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22  rent table %s\n"
28b70 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , zParent);.    
28b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28b90 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20  ee(zPrev);.     
28ba0 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c       zPrev = sql
28bb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
28bc0 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ", zParent);.   
28bd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28be0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
28bf0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
28c00 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d  tf(out, "%s%s --
28c10 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74  > %s\n", zIndent
28c20 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b  , zCI, zTarget);
28c30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
28c40 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
28c50 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
28c60 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e  ntf(out, "%s/* n
28c70 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65 73 20  o extra indexes 
28c80 72 65 71 75 69 72 65 64 20 66 6f 72 20 25 73 20  required for %s 
28c90 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  -> %s */\n",.   
28ca0 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65             zInde
28cb0 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67  nt, zFrom, zTarg
28cc0 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  et.          );.
28cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28ce0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
28cf0 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b  te3_free(zPrev);
28d00 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
28d10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28d20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28d30 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
28d40 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
28d50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20  .    }..    rc2 
28d60 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
28d70 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66  ze(pSql);.    if
28d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28d90 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  && rc2!=SQLITE_O
28da0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28db0 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  rc2;.      raw_p
28dc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
28dd0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
28de0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
28df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
28e00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
28e10 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
28e20 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
28e30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
28e40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
28e50 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e  ntation of ".lin
28e60 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a  t" dot command..
28e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
28e80 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  ntDotCommand(.  
28e90 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
28ea0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28eb0 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
28ec0 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
28ed0 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
28f00 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
28f10 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
28f20 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
28f50 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
28f60 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ] */.){.  int n;
28f70 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20  .  n = (nArg>=2 
28f80 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  ? strlen30(azArg
28f90 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28  [1]) : 0);.  if(
28fa0 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f   n<1 || sqlite3_
28fb0 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31  strnicmp(azArg[1
28fc0 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73  ], "fkey-indexes
28fd0 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61  ", n) ) goto usa
28fe0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e  ge;.  return lin
28ff0 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74  tFkeyIndexes(pSt
29000 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  ate, azArg, nArg
29010 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61  );.. usage:.  ra
29020 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29030 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d 63   "Usage %s sub-c
29040 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73  ommand ?switches
29050 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30  ...?\n", azArg[0
29060 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ]);.  raw_printf
29070 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65 20  (stderr, "Where 
29080 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65  sub-commands are
29090 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69  :\n");.  raw_pri
290a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
290b0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22   fkey-indexes\n"
290c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
290d0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66  TE_ERROR;.}..#if
290e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
290f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
29100 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
29110 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
29120 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
29130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29170 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63  ***.** The ".arc
29180 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
29190 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
291a0 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
291b0 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
291c0 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
291d0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
291e0 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33  zSql, .  sqlite3
291f0 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29  _stmt **ppStmt.)
29200 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  {.  *ppStmt = 0;
29210 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
29220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
29230 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
29240 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
29250 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
29260 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
29270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29280 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29290 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72  derr, "sql error
292a0 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20  : %s (%d)\n", . 
292b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
292c0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c  _errmsg(db), sql
292d0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
292e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
292f0 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  *pRc = rc;.    }
29300 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
29310 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
29320 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  Printf(.  sqlite
29330 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
29340 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
29350 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
29360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
29370 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70  , .  ....){.  *p
29380 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
29390 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
293a0 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
293b0 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ap;.    char *z;
293c0 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
293d0 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d  , zFmt);.    z =
293e0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
293f0 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  f(zFmt, ap);.   
29400 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20   va_end(ap);.   
29410 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
29420 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
29430 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
29440 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72  e{.      shellPr
29450 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a  epare(db, pRc, z
29460 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  , ppStmt);.     
29470 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
29480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
29490 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
294a0 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20  Finalize(.  int 
294b0 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
294c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
294d0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
294e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
294f0 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
29500 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  le(pStmt);.    i
29510 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29520 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
29530 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  .    if( *pRc==S
29540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29570 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29580 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73  , "SQL error: %s
29590 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
295a0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
295b0 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  }.      *pRc = r
295c0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  c;.    }.  }.}..
295d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
295e0 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70  lReset(.  int *p
295f0 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
29600 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
29610 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
29620 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
29630 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
29640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
29650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
29670 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
29680 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
29690 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
296a0 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
296b0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
296c0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
296d0 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d      }.    *pRc =
296e0 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a   rc;.  }.}./*.**
296f0 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72 65   Structure repre
29700 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  senting a single
29710 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a   ".ar" command..
29720 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
29730 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f  t ArCommand ArCo
29740 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72  mmand;.struct Ar
29750 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65  Command {.  u8 e
29760 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cmd;            
29770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29780 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65  n AR_CMD_* value
29790 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73   */.  u8 bVerbos
297a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
297b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
297c0 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20   --verbose */.  
297d0 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20  u8 bZip;        
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 61  /* True if the a
29800 72 63 68 69 76 65 20 69 73 20 61 20 5a 49 50 20  rchive is a ZIP 
29810 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b  */.  u8 bDryRun;
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
29840 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75  --dry-run */.  u
29850 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20  8 bAppend;      
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29870 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65  * True if --appe
29880 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43  nd */.  u8 fromC
29890 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  mdLine;         
298a0 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 66          /* Run f
298b0 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20 6f  rom -A instead o
298c0 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  f .archive */.  
298d0 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d  /* Number of com
29900 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
29910 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54 61  /.  char *zSrcTa
29920 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
29930 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20      /* "sqlar", 
29940 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29 22  "zipfile($file)"
29950 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63   or "zip" */.  c
29960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
29970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29980 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e  * --file argumen
29990 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  t, or NULL */.  
299a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
299b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
299c0 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 61  /* --directory a
299d0 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
299e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
299f0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
29a00 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
29a10 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  f command argume
29a20 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74  nts */.  ShellSt
29a30 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ate *p;         
29a40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c           /* Shel
29a50 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  l state */.  sql
29a60 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a80 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  Database contain
29a90 69 6e 67 20 74 68 65 20 61 72 63 68 69 76 65 20  ing the archive 
29aa0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  */.};../*.** Pri
29ab0 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61  nt a usage messa
29ac0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
29ad0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
29ae0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
29af0 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61  TE_ERROR..*/.sta
29b00 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28  tic int arUsage(
29b10 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77  FILE *f){.  show
29b20 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65 22  Help(f,"archive"
29b30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29b40 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
29b50 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
29b60 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68  r message for th
29b70 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f  e .ar command to
29b80 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
29b90 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
29ba0 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
29bb0 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72  nt arErrorMsg(Ar
29bc0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
29bd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
29be0 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
29bf0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
29c00 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
29c10 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  mt);.  z = sqlit
29c20 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
29c30 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
29c40 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  ap);.  utf8_prin
29c50 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
29c60 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  r: %s\n", z);.  
29c70 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64  if( pAr->fromCmd
29c80 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38  Line ){.    utf8
29c90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29ca0 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20  "Use \"-A\" for 
29cb0 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
29cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38   }else{.    utf8
29cd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29ce0 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20  "Use \".archive 
29cf0 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72  --help\" for mor
29d00 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a  e help\n");.  }.
29d10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29d30 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
29d40 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72  ** Values for Ar
29d50 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f  Command.eCmd..*/
29d60 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
29d70 43 52 45 41 54 45 20 20 20 20 20 20 20 31 0a 23  CREATE       1.#
29d80 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50  define AR_CMD_UP
29d90 44 41 54 45 20 20 20 20 20 20 20 32 0a 23 64 65  DATE       2.#de
29da0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45  fine AR_CMD_INSE
29db0 52 54 20 20 20 20 20 20 20 33 0a 23 64 65 66 69  RT       3.#defi
29dc0 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ne AR_CMD_EXTRAC
29dd0 54 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65  T      4.#define
29de0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20   AR_CMD_LIST    
29df0 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 41       5.#define A
29e00 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20  R_CMD_HELP      
29e10 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65     6../*.** Othe
29e20 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20  r (non-command) 
29e30 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65  switches..*/.#de
29e40 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56  fine AR_SWITCH_V
29e50 45 52 42 4f 53 45 20 20 20 20 20 37 0a 23 64 65  ERBOSE     7.#de
29e60 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46  fine AR_SWITCH_F
29e70 49 4c 45 20 20 20 20 20 20 20 20 38 0a 23 64 65  ILE        8.#de
29e80 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
29e90 49 52 45 43 54 4f 52 59 20 20 20 39 0a 23 64 65  IRECTORY   9.#de
29ea0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41  fine AR_SWITCH_A
29eb0 50 50 45 4e 44 20 20 20 20 20 31 30 0a 23 64 65  PPEND     10.#de
29ec0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
29ed0 52 59 52 55 4e 20 20 20 20 20 31 31 0a 0a 73 74  RYRUN     11..st
29ee0 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65  atic int arProce
29ef0 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61  ssSwitch(ArComma
29f00 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77  nd *pAr, int eSw
29f10 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  itch, const char
29f20 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *zArg){.  switc
29f30 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20  h( eSwitch ){.  
29f40 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
29f50 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  EATE:.    case A
29f60 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
29f70 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c     case AR_CMD_L
29f80 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  IST:.    case AR
29f90 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20  _CMD_UPDATE:.   
29fa0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53   case AR_CMD_INS
29fb0 45 52 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ERT:.    case AR
29fc0 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20  _CMD_HELP:.     
29fd0 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29   if( pAr->eCmd )
29fe0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
29ff0 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2a000 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61   "multiple comma
2a010 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
2a020 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
2a030 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
2a040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2a050 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2a060 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20  H_DRYRUN:.      
2a070 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31  pAr->bDryRun = 1
2a080 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2a090 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2a0a0 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
2a0b0 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
2a0c0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2a0d0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
2a0e0 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20  TCH_APPEND:.    
2a0f0 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d    pAr->bAppend =
2a100 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   1;.      /* Fal
2a110 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69  l thru into --fi
2a120 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41  le */.    case A
2a130 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20  R_SWITCH_FILE:. 
2a140 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20       pAr->zFile 
2a150 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
2a160 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
2a170 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52  _SWITCH_DIRECTOR
2a180 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44  Y:.      pAr->zD
2a190 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  ir = zArg;.     
2a1a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
2a1b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
2a1d0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
2a1e0 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f   for an ".ar" co
2a1f0 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c  mmand. The resul
2a200 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
2a210 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nto.** structure
2a220 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f   (*pAr). SQLITE_
2a230 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2a240 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  f the command li
2a250 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20  ne is parsed.** 
2a260 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74  successfully, ot
2a270 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
2a280 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
2a290 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e  ten to stderr an
2a2a0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  d .** SQLITE_ERR
2a2b0 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OR returned..*/.
2a2c0 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72  static int arPar
2a2d0 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61  seCommand(.  cha
2a2e0 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a300 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
2a310 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
2a320 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2a330 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a350 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2a360 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
2a370 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
2a380 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
2a390 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2a3a0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
2a3b0 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
2a3c0 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ch {.    const c
2a3d0 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
2a3e0 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20  char cShort;.   
2a3f0 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20   u8 eSwitch;.   
2a400 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53   u8 bArg;.  } aS
2a410 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20  witch[] = {.    
2a420 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27  { "create",    '
2a430 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  c', AR_CMD_CREAT
2a440 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  E,       0 },.  
2a450 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20    { "extract",  
2a460 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54   'x', AR_CMD_EXT
2a470 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a  RACT,      0 },.
2a480 20 20 20 20 7b 20 22 69 6e 73 65 72 74 22 2c 20      { "insert", 
2a490 20 20 20 27 69 27 2c 20 41 52 5f 43 4d 44 5f 49     'i', AR_CMD_I
2a4a0 4e 53 45 52 54 2c 20 20 20 20 20 20 20 30 20 7d  NSERT,       0 }
2a4b0 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20  ,.    { "list", 
2a4c0 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44       't', AR_CMD
2a4d0 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30  _LIST,         0
2a4e0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74   },.    { "updat
2a4f0 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43  e",    'u', AR_C
2a500 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20  MD_UPDATE,      
2a510 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c   0 },.    { "hel
2a520 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52  p",      'h', AR
2a530 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20  _CMD_HELP,      
2a540 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76     0 },.    { "v
2a550 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20  erbose",   'v', 
2a560 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
2a570 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  E,   0 },.    { 
2a580 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27  "file",      'f'
2a590 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  , AR_SWITCH_FILE
2a5a0 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ,      1 },.    
2a5b0 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27  { "append",    '
2a5c0 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50  a', AR_SWITCH_AP
2a5d0 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20  PEND,    1 },.  
2a5e0 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c    { "directory",
2a5f0 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'C', AR_SWITCH_
2a600 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a  DIRECTORY, 1 },.
2a610 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20      { "dryrun", 
2a620 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43     'n', AR_SWITC
2a630 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d  H_DRYRUN,    0 }
2a640 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77  ,.  };.  int nSw
2a650 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53  itch = sizeof(aS
2a660 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28  witch) / sizeof(
2a670 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29  struct ArSwitch)
2a680 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  ;.  struct ArSwi
2a690 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77  tch *pEnd = &aSw
2a6a0 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a  itch[nSwitch];..
2a6b0 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b    if( nArg<=1 ){
2a6c0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2a6d0 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67 20  (stderr, "Wrong 
2a6e0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
2a6f0 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22 29  nts.  Usage:\n")
2a700 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55  ;.    return arU
2a710 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20  sage(stderr);.  
2a720 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
2a730 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  *z = azArg[1];. 
2a740 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
2a750 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61   ){.      /* Tra
2a760 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b  ditional style [
2a770 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tar] invocation 
2a780 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
2a790 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d        int iArg =
2a7a0 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   2;.      for(i=
2a7b0 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
2a7c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2a7d0 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
2a7e0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
2a7f0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
2a800 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
2a810 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
2a820 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
2a830 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d          if( z[i]
2a840 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29  ==pOpt->cShort )
2a850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a860 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
2a870 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
2a880 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2a890 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
2a8a0 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
2a8b0 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
2a8c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a8d0 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
2a8e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a8f0 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
2a900 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2a910 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2a920 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
2a930 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
2a940 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  %c",z[i]);.     
2a950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a960 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 41   zArg = azArg[iA
2a970 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d  rg++];.        }
2a980 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50  .        if( arP
2a990 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
2a9a0 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
2a9b0 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
2a9c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a9d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
2a9e0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
2a9f0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  g;.      if( pAr
2aa00 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ->nArg>0 ){.    
2aa10 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2aa20 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
2aa30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2aa40 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74  {.      /* Non-t
2aa50 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63  raditional invoc
2aa60 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2aa70 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20 66  nt iArg;.      f
2aa80 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67 3c  or(iArg=1; iArg<
2aa90 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20  nArg; iArg++){. 
2aaa0 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
2aab0 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b        z = azArg[
2aac0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 69  iArg];.        i
2aad0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
2aae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2aaf0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
2ab00 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61 72  nd line words ar
2ab10 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
2ab20 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nts. */.        
2ab30 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
2ab40 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
2ab50 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
2ab60 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
2ab70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2ab80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ab90 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
2aba0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ;..        if( z
2abb0 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]!='-' ){.    
2abc0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2abd0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72         /* One or
2abe0 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74 69   more short opti
2abf0 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ons */.         
2ac00 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
2ac10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2ac20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2ac30 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
2ac40 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
2ac50 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
2ac60 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
2ac70 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
2ac80 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2aca0 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
2acb0 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
2acc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2acd0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
2ace0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
2acf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2ad00 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2ad10 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2ad20 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
2ad30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ad40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2ad50 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  Opt->bArg ){.   
2ad60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2ad70 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  <(n-1) ){.      
2ad80 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
2ad90 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20   &z[i+1];.      
2ada0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b            i = n;
2adb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2adc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2add0 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
2ade0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2ae00 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2ae10 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  pAr, "option req
2ae20 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
2ae30 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae60 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
2ae70 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
2ae80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ae90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2aea0 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2aeb0 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65  tch(pAr, pOpt->e
2aec0 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
2aed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2aee0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
2aef0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2af00 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b  f( z[2]=='\0' ){
2af10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2af20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63  -- option, indic
2af30 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72  ating that all r
2af40 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64  emaining command
2af50 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20   line words.    
2af60 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d        ** are com
2af70 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
2af80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41   */.          pA
2af90 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
2afa0 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  g[iArg+1];.     
2afb0 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
2afc0 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20   nArg-iArg-1;.  
2afd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2afe0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2aff0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e          /* A lon
2b000 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
2b010 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b020 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20   *zArg = 0;     
2b030 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
2b040 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20  ent for option, 
2b050 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20  if any */.      
2b060 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
2b070 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tch *pMatch = 0;
2b080 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e        /* Matchin
2b090 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
2b0a0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2b0b0 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20  witch *pOpt;    
2b0c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2b0d0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
2b0e0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
2b0f0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
2b100 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
2b110 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b120 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d  r *zLong = pOpt-
2b130 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20  >zLong;.        
2b140 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73      if( (n-2)<=s
2b150 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26  trlen30(zLong) &
2b160 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32  & 0==memcmp(&z[2
2b170 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29  ], zLong, n-2) )
2b180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b190 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20  if( pMatch ){.  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b1b0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2b1c0 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20  pAr, "ambiguous 
2b1d0 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a  option: %s",z);.
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2b1f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2b200 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f       pMatch = pO
2b210 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
2b220 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b230 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
2b240 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
2b250 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tch==0 ){.      
2b260 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2b270 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
2b280 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
2b290 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  n: %s", z);.    
2b2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b2b0 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62 41    if( pMatch->bA
2b2c0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2b2d0 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72    if( iArg>=(nAr
2b2e0 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
2b2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2b300 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
2b310 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
2b320 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20   argument: %s", 
2b330 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
2b340 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41  }.            zA
2b350 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72  rg = azArg[++iAr
2b360 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g];.          }.
2b370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72            if( ar
2b380 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
2b390 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74  r, pMatch->eSwit
2b3a0 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
2b3b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2b3c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b3d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2b3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2b400 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2b410 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65   that all argume
2b420 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41  nts within the A
2b430 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d  rCommand.azArg[]
2b440 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20  .** array refer 
2b450 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65  to archive membe
2b460 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d  rs, as for the -
2b470 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69  -extract or --li
2b480 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a  st commands. .**
2b490 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20   It checks that 
2b4a0 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65  each of them are
2b4b0 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79   present. If any
2b4c0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2b4d0 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e  is not.** presen
2b4e0 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65  t in the archive
2b4f0 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72  , an error is pr
2b500 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20  inted to stderr 
2b510 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  and an error.** 
2b520 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f  code returned. O
2b530 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
2b540 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d   specified argum
2b550 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74  ents are present
2b560 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69   in.** the archi
2b570 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ve, SQLITE_OK is
2b580 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2b590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2b5a0 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69  trips any traili
2b5b0 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72  ng '/' character
2b5c0 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75  s from each argu
2b5d0 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73  ment..** This is
2b5e0 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
2b5f0 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61   the way the [ta
2b600 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73  r] command seems
2b610 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c   to work on.** L
2b620 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inux..*/.static 
2b630 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69  int arCheckEntri
2b640 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  es(ArCommand *pA
2b650 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2b660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2b670 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20  pAr->nArg ){.   
2b680 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73   int i, j;.    s
2b690 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65  qlite3_stmt *pTe
2b6a0 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65  st = 0;..    she
2b6b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
2b6c0 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
2b6d0 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53  Test,.        "S
2b6e0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
2b6f0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e  %s WHERE name=$n
2b700 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70  ame", .        p
2b710 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20  Ar->zSrcTable.  
2b720 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c    );.    j = sql
2b730 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2b740 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c  ter_index(pTest,
2b750 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66   "$name");.    f
2b760 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
2b770 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
2b780 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2b790 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d    char *z = pAr-
2b7a0 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
2b7b0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
2b7c0 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  0(z);.      int 
2b7d0 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  bOk = 0;.      w
2b7e0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
2b7f0 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a  -1]=='/' ) n--;.
2b800 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30        z[n] = '\0
2b810 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
2b820 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74  _bind_text(pTest
2b830 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  , j, z, -1, SQLI
2b840 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
2b850 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
2b860 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2b870 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Test) ){.       
2b880 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOk = 1;.      
2b890 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73  }.      shellRes
2b8a0 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  et(&rc, pTest);.
2b8b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b8c0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d  LITE_OK && bOk==
2b8d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
2b8e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2b8f0 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61   "not found in a
2b900 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a  rchive: %s\n", z
2b910 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b920 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b940 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
2b950 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20  c, pTest);.  }. 
2b960 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b970 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48  *.** Format a WH
2b980 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2b990 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69  can be used agai
2b9a0 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20  nst the "sqlar" 
2b9b0 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e  table to.** iden
2b9c0 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65  tify all archive
2b9d0 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61   members that ma
2b9e0 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  tch the command 
2b9f0 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a  arguments held.*
2ba00 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61  * in (*pAr). Lea
2ba10 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c  ve this WHERE cl
2ba20 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72  ause in (*pzWher
2ba30 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  e) before return
2ba40 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ing..** The call
2ba50 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2ba60 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79  e for eventually
2ba70 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
2ba80 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e  _free() on.** an
2ba90 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57  y non-NULL (*pzW
2baa0 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a  here) value..*/.
2bab0 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68  static void arWh
2bac0 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74  ereClause(.  int
2bad0 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d   *pRc, .  ArComm
2bae0 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61  and *pAr, .  cha
2baf0 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20  r **pzWhere     
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb10 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63  OUT: New WHERE c
2bb20 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68  lause */.){.  ch
2bb30 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
2bb40 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
2bb50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2bb60 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b   pAr->nArg==0 ){
2bb70 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20  .      zWhere = 
2bb80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2bb90 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "1");.    }else{
2bba0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2bbb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2bbc0 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20  zSep = "";.     
2bbd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2bbe0 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nArg; i++){.   
2bbf0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2bc00 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b  *z = pAr->azArg[
2bc10 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65  i];.        zWhe
2bc20 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
2bc30 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
2bc40 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71  "%z%s name = '%q
2bc50 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65  ' OR substr(name
2bc60 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c  ,1,%d) = '%q/'",
2bc70 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65   .          zWhe
2bc80 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72  re, zSep, z, str
2bc90 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20  len30(z)+1, z.  
2bca0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2bcb0 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29   if( zWhere==0 )
2bcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 63  {.          *pRc
2bcd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2bce0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bcf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bd00 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20      zSep = " OR 
2bd10 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
2bd20 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20  .  }.  *pzWhere 
2bd30 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a  = zWhere;.}../*.
2bd40 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2bd50 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20  n of .ar "lisT" 
2bd60 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
2bd70 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f  tic int arListCo
2bd80 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20  mmand(ArCommand 
2bd90 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pAr){.  const c
2bda0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c  har *zSql = "SEL
2bdb0 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57  ECT %s FROM %s W
2bdc0 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e  HERE %s"; .  con
2bdd0 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b  st char *azCols[
2bde0 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22  ] = {.    "name"
2bdf0 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f  ,.    "lsmode(mo
2be00 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d  de), sz, datetim
2be10 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70  e(mtime, 'unixep
2be20 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d  och'), name".  }
2be30 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ;..  char *zWher
2be40 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2be50 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
2be60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2be70 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65   = arCheckEntrie
2be80 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72  s(pAr);.  arWher
2be90 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72  eClause(&rc, pAr
2bea0 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73  , &zWhere);..  s
2beb0 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2bec0 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2bed0 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43  &pSql, zSql, azC
2bee0 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73  ols[pAr->bVerbos
2bef0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
2bf00 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53           pAr->zS
2bf10 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29  rcTable, zWhere)
2bf20 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72  ;.  if( pAr->bDr
2bf30 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38  yRun ){.    utf8
2bf40 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2bf50 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
2bf60 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b  ite3_sql(pSql));
2bf70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2bf80 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2bf90 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2bfa0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2bfb0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sql) ){.      if
2bfc0 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20  ( pAr->bVerbose 
2bfd0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2bfe0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2bff0 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20 25  ut, "%s % 10d  %
2c000 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s  %s\n",.      
2c010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2c020 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2c030 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2c040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c050 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20  nt(pSql, 1), .  
2c060 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c070 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2c080 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20  ql, 2),.        
2c090 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
2c0a0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
2c0b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c0c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c0d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2c0e0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2c0f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2c100 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
2c110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c120 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69   }.  shellFinali
2c130 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
2c140 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
2c150 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
2c160 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
2c170 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2c180 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
2c190 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
2c1a0 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
2c1b0 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
2c1c0 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
2c1d0 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20  char *zSql1 = . 
2c1e0 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20     "SELECT ".   
2c1f0 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65   " ($dir || name
2c200 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66  ),".    " writef
2c210 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d  ile(($dir || nam
2c220 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74  e), %s, mode, mt
2c230 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d  ime) ".    "FROM
2c240 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41   %s WHERE (%s) A
2c250 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c  ND (data IS NULL
2c260 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30   OR $dirOnly = 0
2c270 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61 6d  )".    " AND nam
2c280 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e 5b  e NOT GLOB '*..[
2c290 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e 73  /\\]*'";..  cons
2c2a0 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61 41  t char *azExtraA
2c2b0 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22 73  rg[] = { .    "s
2c2c0 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73 28  qlar_uncompress(
2c2d0 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20 20  data, sz)",.    
2c2e0 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20 73  "data".  };..  s
2c2f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
2c300 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
2c310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
2c320 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20  har *zDir = 0;. 
2c330 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
2c340 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  0;.  int i, j;..
2c350 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2c360 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  s are specified,
2c370 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 79   check that they
2c380 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
2c390 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
2c3a0 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20 70  archive before p
2c3b0 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66  roceeding. And f
2c3c0 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45  ormulate a WHERE
2c3d0 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20   clause to.  ** 
2c3e0 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a  match them.  */.
2c3f0 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
2c400 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72  tries(pAr);.  ar
2c410 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
2c420 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
2c430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c450 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20 20  pAr->zDir ){.   
2c460 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
2c470 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c  3_mprintf("%s/",
2c480 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
2c490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44   }else{.      zD
2c4a0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
2c4b0 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d 0a  intf("");.    }.
2c4c0 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
2c4d0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
2c4e0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65 6c  MEM;.  }..  shel
2c4f0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
2c500 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
2c510 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20  ql, zSql1, .    
2c520 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41 72    azExtraArg[pAr
2c530 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a 53  ->bZip], pAr->zS
2c540 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 0a  rcTable, zWhere.
2c550 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
2c560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c570 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
2c580 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2c590 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29 3b  x(pSql, "$dir");
2c5a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
2c5b0 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c 20  d_text(pSql, j, 
2c5c0 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zDir, -1, SQLITE
2c5d0 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f  _STATIC);..    /
2c5e0 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43 54  * Run the SELECT
2c5f0 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63 65   statement twice
2c600 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
2c610 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69 73  , writefile() is
2c620 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66   called.    ** f
2c630 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d  or all archive m
2c640 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f 75  embers that shou
2c650 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64 2e  ld be extracted.
2c660 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d 65   The second time
2c670 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f  ,.    ** only fo
2c680 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  r the directorie
2c690 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
2c6a0 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  se the timestamp
2c6b0 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78 74  s for.    ** ext
2c6c0 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72 69  racted directori
2c6d0 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  es must be reset
2c6e0 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65 20   after they are 
2c6f0 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20 20  populated (as.  
2c700 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67 20    ** populating 
2c710 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68 65  them changes the
2c720 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a 2f   timestamp).  */
2c730 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c740 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  2; i++){.      j
2c750 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
2c760 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
2c770 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79 22  pSql, "$dirOnly"
2c780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c790 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
2c7a0 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  j, i);.      if(
2c7b0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
2c7c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2c7d0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2c7e0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
2c7f0 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
2c800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c810 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2c820 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2c830 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2c840 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
2c850 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
2c860 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  && pAr->bVerbose
2c870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c880 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2c890 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
2c8a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c8b0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
2c8c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c8e0 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26      shellReset(&
2c8f0 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d  rc, pSql);.    }
2c900 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
2c910 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
2c920 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
2c930 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69  ee(zDir);.  sqli
2c940 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
2c950 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c960 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
2c970 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
2c980 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64 6f   zSql.  Or if do
2c990 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c 20  ing a --dryrun, 
2c9a0 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74 20  merely print it 
2c9b0 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  out..*/.static i
2c9c0 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72 43  nt arExecSql(ArC
2c9d0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
2c9e0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
2c9f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
2ca00 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
2ca10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ca20 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2ca30 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
2ca40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ca50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
2ca60 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
2ca70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2ca80 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c  ec(pAr->db, zSql
2ca90 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
2caa0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
2cab0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cac0 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f 52  f(stdout, "ERROR
2cad0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
2cae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2caf0 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ee(zErr);.    }.
2cb00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2cb10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
2cb20 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
2cb30 20 22 63 72 65 61 74 65 22 2c 20 22 69 6e 73 65   "create", "inse
2cb40 72 74 22 2c 20 61 6e 64 20 22 75 70 64 61 74 65  rt", and "update
2cb50 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
2cb60 2a 20 20 20 20 20 63 72 65 61 74 65 20 20 20 20  *     create    
2cb70 2d 3e 20 20 20 20 20 43 72 65 61 74 65 20 61 20  ->     Create a 
2cb80 6e 65 77 20 53 51 4c 20 61 72 63 68 69 76 65 0a  new SQL archive.
2cb90 2a 2a 20 20 20 20 20 69 6e 73 65 72 74 20 20 20  **     insert   
2cba0 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20 6f   ->     Insert o
2cbb0 72 20 72 65 69 6e 73 65 72 74 20 61 6c 6c 20 66  r reinsert all f
2cbc0 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a 20 20  iles listed.**  
2cbd0 20 20 20 75 70 64 61 74 65 20 20 20 20 2d 3e 20     update    -> 
2cbe0 20 20 20 20 49 6e 73 65 72 74 20 66 69 6c 65 73      Insert files
2cbf0 20 74 68 61 74 20 68 61 76 65 20 63 68 61 6e 67   that have chang
2cc00 65 64 20 6f 72 20 74 68 61 74 20 77 65 72 65 20  ed or that were 
2cc10 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  not.**          
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
2cc30 69 6f 75 73 6c 79 20 69 6e 20 74 68 65 20 61 72  iously in the ar
2cc40 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43 72 65 61  chive.**.** Crea
2cc50 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  te the "sqlar" t
2cc60 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2cc70 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  base if it does 
2cc80 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2cc90 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65  t..** Then add e
2cca0 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ach file in the 
2ccb0 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74  azFile[] array t
2ccc0 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20 44  o the archive. D
2ccd0 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72  irectories.** ar
2cce0 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69 76  e added recursiv
2ccf0 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ely. If argument
2cd00 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e   bVerbose is non
2cd10 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65  -zero, a message
2cd20 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f   is.** printed o
2cd30 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63  n stdout for eac
2cd40 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e  h file archived.
2cd50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61 74  .**.** The creat
2cd60 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65  e command is the
2cd70 20 73 61 6d 65 20 61 73 20 75 70 64 61 74 65 2c   same as update,
2cd80 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
2cd90 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69  drops.** any exi
2cda0 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74 61  sting "sqlar" ta
2cdb0 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e  ble before begin
2cdc0 6e 69 6e 67 2e 20 20 54 68 65 20 22 69 6e 73 65  ning.  The "inse
2cdd0 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 61  rt" command.** a
2cde0 6c 77 61 79 73 20 6f 76 65 72 77 72 69 74 65 73  lways overwrites
2cdf0 20 65 76 65 72 79 20 66 69 6c 65 20 6e 61 6d 65   every file name
2ce00 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
2ce10 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20 61 73 0a  -line, where as.
2ce20 2a 2a 20 22 75 70 64 61 74 65 22 20 6f 6e 6c 79  ** "update" only
2ce30 20 6f 76 65 72 77 72 69 74 65 73 20 69 66 20 74   overwrites if t
2ce40 68 65 20 73 69 7a 65 20 6f 72 20 6d 74 69 6d 65  he size or mtime
2ce50 20 6f 72 20 6d 6f 64 65 20 68 61 73 20 63 68 61   or mode has cha
2ce60 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
2ce70 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72 55 70  int arCreateOrUp
2ce80 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41  dateCommand(.  A
2ce90 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20  rCommand *pAr,  
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ceb0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2cec0 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20  nts and options 
2ced0 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65  */.  int bUpdate
2cee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cef0 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66 6f 72       /* true for
2cf00 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 2a 2f 0a   a --create. */.
2cf10 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66 43 68 61    int bOnlyIfCha
2cf20 6e 67 65 64 20 20 20 20 20 20 20 20 20 20 20 20  nged            
2cf30 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65    /* Only update
2cf40 20 69 66 20 66 69 6c 65 20 68 61 73 20 63 68 61   if file has cha
2cf50 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  nged */.){.  con
2cf60 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
2cf70 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
2cf80 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2cf90 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
2cfa0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
2cfb0 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
2cfc0 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
2cfd0 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
2cfe0 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
2cff0 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
2d000 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
2d010 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
2d020 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2d030 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
2d040 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
2d050 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d070 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
2d080 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
2d090 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
2d0a0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
2d0b0 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
2d0c0 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
2d0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
2d0e0 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
2d0f0 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
2d100 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
2d110 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d  *zInsertFmt[2] =
2d120 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45   {.     "REPLACE
2d130 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
2d140 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61  de,mtime,sz,data
2d150 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c  )\n".     "  SEL
2d160 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ECT\n".     "   
2d170 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20   %s,\n".     "  
2d180 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20    mode,\n".     
2d190 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20  "    mtime,\n". 
2d1a0 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75      "    CASE su
2d1b0 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65  bstr(lsmode(mode
2d1c0 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22  ),1,1)\n".     "
2d1d0 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54        WHEN '-' T
2d1e0 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29  HEN length(data)
2d1f0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
2d200 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c  WHEN 'd' THEN 0\
2d210 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45  n".     "      E
2d220 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20  LSE -1 END,\n". 
2d230 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63      "    sqlar_c
2d240 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22  ompress(data)\n"
2d250 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73  .     "  FROM fs
2d260 64 69 72 28 25 51 2c 25 51 29 20 41 53 20 64 69  dir(%Q,%Q) AS di
2d270 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  sk\n".     "  WH
2d280 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
2d290 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 25   NOT LIKE '?%%'%
2d2a0 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20 20 20 20  s;".     ,.     
2d2b0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
2d2c0 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
2d2d0 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
2d2e0 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
2d2f0 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
2d300 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
2d310 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
2d320 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64 61  \n".     "    da
2d330 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  ta\n".     "  FR
2d340 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 20  OM fsdir(%Q,%Q) 
2d350 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20  AS disk\n".     
2d360 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
2d370 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
2d380 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b 0a 20 20  ?%%'%s;".  };.  
2d390 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3b0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
2d3c0 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b   through azFile[
2d3d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d400 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
2d410 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
2d420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
2d430 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  L table into whi
2d440 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ch to insert */.
2d450 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2d460 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a  char zTemp[50];.
2d470 20 20 63 68 61 72 20 2a 7a 45 78 69 73 74 73 20    char *zExists 
2d480 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65 63 53 71  = 0;..  arExecSq
2d490 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20 70  l(pAr, "PRAGMA p
2d4a0 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a  age_size=512");.
2d4b0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2d4c0 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54  (pAr, "SAVEPOINT
2d4d0 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63   ar;");.  if( rc
2d4e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2d4f0 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70  turn rc;.  zTemp
2d500 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28 20  [0] = 0; .  if( 
2d510 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20  pAr->bZip ){.   
2d520 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2d530 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75  he zipfile virtu
2d540 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65 63  al table, if nec
2d550 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
2d560 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a  ( pAr->zFile ){.
2d570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
2d580 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73 71  nt64 r;.      sq
2d590 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
2d5a0 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a  (sizeof(r),&r);.
2d5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d5c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
2d5d0 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25  emp),zTemp,"zip%
2d5e0 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20  016llx",r);.    
2d5f0 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a    zTab = zTemp;.
2d600 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
2d610 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2d620 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56         "CREATE V
2d630 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d  IRTUAL TABLE tem
2d640 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66 69  p.%s USING zipfi
2d650 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20 20  le(%Q)",.       
2d660 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69    zTab, pAr->zFi
2d670 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  le.      );.    
2d680 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2d690 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
2d6a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d6b0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
2d6c0 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 22  {.      zTab = "
2d6d0 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  zip";.    }.  }e
2d6e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
2d6f0 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
2d700 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f   for an SQLAR */
2d710 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c  .    zTab = "sql
2d720 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55 70  ar";.    if( bUp
2d730 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  date==0 ){.     
2d740 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2d750 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20  pAr, zDrop);.   
2d760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d770 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2d780 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  ar_transaction;.
2d790 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61      }.    rc = a
2d7a0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43  rExecSql(pAr, zC
2d7b0 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  reate);.  }.  if
2d7c0 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67 65 64  ( bOnlyIfChanged
2d7d0 20 29 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20   ){.    zExists 
2d7e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2d7f0 66 28 0a 20 20 20 20 20 20 22 20 41 4e 44 20 4e  f(.      " AND N
2d800 4f 54 20 45 58 49 53 54 53 28 22 0a 20 20 20 20  OT EXISTS(".    
2d810 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20        "SELECT 1 
2d820 46 52 4f 4d 20 25 73 20 41 53 20 6d 65 6d 22 0a  FROM %s AS mem".
2d830 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2d840 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69 73 6b 2e  E mem.name=disk.
2d850 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20  name".          
2d860 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69 6d 65 3d  " AND mem.mtime=
2d870 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20 20 20 20  disk.mtime".    
2d880 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e        " AND mem.
2d890 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64 65 29 22  mode=disk.mode)"
2d8a0 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  , zTab);.  }else
2d8b0 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20 3d 20  {.    zExists = 
2d8c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2d8d0 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  "");.  }.  if( z
2d8e0 45 78 69 73 74 73 3d 3d 30 20 29 20 72 63 20 3d  Exists==0 ) rc =
2d8f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2d900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2d910 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2d920 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2d930 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20    char *zSql2 = 
2d940 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2d950 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e  zInsertFmt[pAr->
2d960 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20  bZip], zTab,.   
2d970 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
2d980 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
2d990 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
2d9a0 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
2d9b0 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
2d9c0 7a 44 69 72 2c 20 7a 45 78 69 73 74 73 29 3b 0a  zDir, zExists);.
2d9d0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2d9e0 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a  ql(pAr, zSql2);.
2d9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da00 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64  (zSql2);.  }.end
2da10 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a  _ar_transaction:
2da20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2da30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2da40 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
2da50 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61  , "ROLLBACK TO a
2da60 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22 2c  r; RELEASE ar;",
2da70 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
2da80 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45  se{.    rc = arE
2da90 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c  xecSql(pAr, "REL
2daa0 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 20 20  EASE ar;");.    
2dab0 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 26 26  if( pAr->bZip &&
2dac0 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20   pAr->zFile ){. 
2dad0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2dae0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f  te3_mprintf("DRO
2daf0 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 65  P TABLE %s", zTe
2db00 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45 78 65  mp);.      arExe
2db10 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b  cSql(pAr, zSql);
2db20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2db30 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2db40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2db50 72 65 65 28 7a 45 78 69 73 74 73 29 3b 0a 20 20  ree(zExists);.  
2db60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2db70 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2db80 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f 74 20  on of ".ar" dot 
2db90 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
2dba0 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d  ic int arDotComm
2dbb0 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
2dbc0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
2dbd0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2dbe0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
2dbf0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d  te */.  int from
2dc00 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20 20 20  CmdLine,        
2dc10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2dc20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69  if -A command-li
2dc30 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e  ne option, not .
2dc40 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72  ar cmd */.  char
2dc50 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2dc70 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2dc80 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
2dc90 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2dca0 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dcc0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2dcd0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
2dce0 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63  ){.  ArCommand c
2dcf0 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  md;.  int rc;.  
2dd00 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20  memset(&cmd, 0, 
2dd10 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20  sizeof(cmd));.  
2dd20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20  cmd.fromCmdLine 
2dd30 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20  = fromCmdLine;. 
2dd40 20 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d   rc = arParseCom
2dd50 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67  mand(azArg, nArg
2dd60 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72  , &cmd);.  if( r
2dd70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dd80 20 20 20 20 69 6e 74 20 65 44 62 54 79 70 65 20      int eDbType 
2dd90 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
2dda0 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d  PEC;.    cmd.p =
2ddb0 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64   pState;.    cmd
2ddc0 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  .db = pState->db
2ddd0 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46  ;.    if( cmd.zF
2dde0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62  ile ){.      eDb
2ddf0 54 79 70 65 20 3d 20 64 65 64 75 63 65 44 61 74  Type = deduceDat
2de00 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46  abaseType(cmd.zF
2de10 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ile, 1);.    }el
2de20 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70  se{.      eDbTyp
2de30 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e  e = pState->open
2de40 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mode;.    }.    
2de50 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45  if( eDbType==SHE
2de60 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
2de70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
2de80 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58  .eCmd==AR_CMD_EX
2de90 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d  TRACT || cmd.eCm
2dea0 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29  d==AR_CMD_LIST )
2deb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6d  {.        if( cm
2dec0 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  d.zFile==0 ){.  
2ded0 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63          cmd.zSrc
2dee0 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  Table = sqlite3_
2def0 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a  mprintf("zip");.
2df00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2df10 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72           cmd.zSr
2df20 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2df30 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c  _mprintf("zipfil
2df40 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c  e(%Q)", cmd.zFil
2df50 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2df60 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
2df70 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65  bZip = 1;.    }e
2df80 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c  lse if( cmd.zFil
2df90 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  e ){.      int f
2dfa0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
2dfb0 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44  cmd.bAppend ) eD
2dfc0 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
2dfd0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
2dfe0 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
2dff0 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  ==AR_CMD_CREATE 
2e000 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
2e010 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20 20 20 20  CMD_INSERT .    
2e020 20 20 20 20 20 20 20 7c 7c 20 63 6d 64 2e 65 43         || cmd.eC
2e030 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
2e040 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  E ){.        fla
2e050 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
2e060 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2e070 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
2e080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e090 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
2e0a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e0b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e0c0 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20  cmd.db = 0;.    
2e0d0 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75    if( cmd.bDryRu
2e0e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  n ){.        utf
2e0f0 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
2e100 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64  >out, "-- open d
2e110 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e  atabase '%s'%s\n
2e120 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20  ", cmd.zFile,.  
2e130 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79             eDbTy
2e140 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  pe==SHELL_OPEN_A
2e150 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69  PPENDVFS ? " usi
2e160 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20  ng 'apndvfs'" : 
2e170 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "");.      }.   
2e180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2e190 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c  open_v2(cmd.zFil
2e1a0 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67  e, &cmd.db, flag
2e1b0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2e1c0 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2e1d0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2e1e0 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b   "apndvfs" : 0);
2e1f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e210 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e220 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
2e230 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25  open file: %s (%
2e240 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s)\n", .        
2e250 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73      cmd.zFile, s
2e260 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d  qlite3_errmsg(cm
2e270 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b  d.db).        );
2e280 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2e290 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
2e2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2e2b0 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
2e2c0 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  cmd.db, 0, 0);. 
2e2d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c       sqlite3_sql
2e2e0 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20  ar_init(cmd.db, 
2e2f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2e300 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2e310 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68  tion(cmd.db, "sh
2e320 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20  ell_putsnl", 1, 
2e330 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64  SQLITE_UTF8, cmd
2e340 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .p,.            
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e360 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
2e370 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20   0, 0);..    }. 
2e380 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54     if( cmd.zSrcT
2e390 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62  able==0 && cmd.b
2e3a0 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43  Zip==0 && cmd.eC
2e3b0 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20  md!=AR_CMD_HELP 
2e3c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
2e3d0 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd!=AR_CMD_CR
2e3e0 45 41 54 45 0a 20 20 20 20 20 20 20 26 26 20 73  EATE.       && s
2e3f0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
2e400 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64  umn_metadata(cmd
2e410 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e  .db,0,"sqlar","n
2e420 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a  ame",0,0,0,0,0).
2e430 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e440 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e450 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20 64  err, "database d
2e460 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
2e470 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65  an 'sqlar' table
2e480 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
2e490 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2e4a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2e4b0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
2e4c0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
2e4d0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2e4e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c  te3_mprintf("sql
2e4f0 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ar");.    }..   
2e500 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d   switch( cmd.eCm
2e510 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  d ){.      case 
2e520 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20  AR_CMD_CREATE:. 
2e530 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
2e540 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
2e550 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20 30 29 3b  and(&cmd, 0, 0);
2e560 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2e570 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2e580 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
2e590 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72 61      rc = arExtra
2e5a0 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  ctCommand(&cmd);
2e5b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2e5c0 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2e5d0 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20  MD_LIST:.       
2e5e0 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d   rc = arListComm
2e5f0 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20  and(&cmd);.     
2e600 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2e610 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
2e620 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73 61  P:.        arUsa
2e630 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b  ge(pState->out);
2e640 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2e650 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2e660 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 20  MD_INSERT:.     
2e670 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65     rc = arCreate
2e680 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2e690 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  &cmd, 1, 0);.   
2e6a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2e6b0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2e6c0 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e      assert( cmd.
2e6d0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
2e6e0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ATE );.        r
2e6f0 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70  c = arCreateOrUp
2e700 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  dateCommand(&cmd
2e710 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
2e720 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2e730 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64  }.end_ar_command
2e740 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21 3d  :.  if( cmd.db!=
2e750 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20  pState->db ){.  
2e760 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e 64    close_db(cmd.d
2e770 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
2e780 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63 54  3_free(cmd.zSrcT
2e790 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  able);..  return
2e7a0 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66   rc;.}./* End of
2e7b0 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22 20   the ".archive" 
2e7c0 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  or ".ar" command
2e7d0 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   logic.*********
2e7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2e830 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
2e840 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e850 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
2e860 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
2e870 4c 49 42 29 20 2a 2f 0a 0a 73 74 61 74 69 63 20  LIB) */..static 
2e880 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63 28 73  void shellExec(s
2e890 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2e8a0 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
2e8b0 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
2e8c0 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66 28 20  c = *pRc;.  if( 
2e8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e8e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20  .    char *zErr 
2e8f0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
2e900 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
2e910 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
2e920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e940 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2e950 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
2e960 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
2e970 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20     }.    *pRc = 
2e980 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  rc;.  }.}..stati
2e990 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c 4d 61 6c  c void *shellMal
2e9a0 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  loc(int *pRc, sq
2e9b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
2e9c0 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
2e9d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2e9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e9f0 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
2ea00 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
2ea10 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
2ea20 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
2ea30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2ea40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ea50 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
2ea60 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
2ea70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
2ea80 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  t;.}..static cha
2ea90 72 20 2a 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28  r *shellMPrintf(
2eaa0 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20  int *pRc, const 
2eab0 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
2eac0 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
2ead0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
2eae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61  ITE_OK ){.    va
2eaf0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
2eb00 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
2eb10 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
2eb20 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
2eb30 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
2eb40 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  (ap);.    if( z=
2eb50 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
2eb60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2eb70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2eb80 75 72 6e 20 7a 3b 0a 7d 0a 0a 74 79 70 65 64 65  urn z;.}..typede
2eb90 66 20 73 74 72 75 63 74 20 52 65 63 6f 76 65 72  f struct Recover
2eba0 54 61 62 6c 65 20 52 65 63 6f 76 65 72 54 61 62  Table RecoverTab
2ebb0 6c 65 3b 0a 73 74 72 75 63 74 20 52 65 63 6f 76  le;.struct Recov
2ebc0 65 72 54 61 62 6c 65 20 7b 0a 20 20 63 68 61 72  erTable {.  char
2ebd0 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ebf0 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a  ame of table */.
2ec00 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 3b    char *zQuoted;
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec20 20 20 2f 2a 20 51 75 6f 74 65 64 20 76 65 72 73    /* Quoted vers
2ec30 69 6f 6e 20 6f 66 20 7a 4e 61 6d 65 20 2a 2f 0a  ion of zName */.
2ec40 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2ec70 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
2ec80 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 6c 43  */.  char **azlC
2ec90 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
2eca0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2ecb0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 73 20 2a 2f   column lists */
2ecc0 0a 20 20 69 6e 74 20 69 50 6b 3b 0a 7d 3b 0a 0a  .  int iPk;.};..
2ecd0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 52 65 63  /*.** Free a Rec
2ece0 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74  overTable object
2ecf0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 65   allocated by re
2ed00 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 29 0a  coverNewTable().
2ed10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2ed20 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28  ecoverFreeTable(
2ed30 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54  RecoverTable *pT
2ed40 61 62 29 7b 0a 20 20 69 66 28 20 70 54 61 62 20  ab){.  if( pTab 
2ed50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2ed60 72 65 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ree(pTab->zName)
2ed70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2ed80 65 65 28 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64  ee(pTab->zQuoted
2ed90 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
2eda0 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >azlCol ){.     
2edb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
2edc0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
2edd0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2ede0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2edf0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 29  pTab->azlCol[i])
2ee00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ee10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
2ee20 62 2d 3e 61 7a 6c 43 6f 6c 29 3b 0a 20 20 20 20  b->azlCol);.    
2ee30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2ee40 65 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a  ee(pTab);.  }.}.
2ee50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
2ee60 6f 76 65 72 4f 6c 64 54 61 62 6c 65 28 0a 20 20  overOldTable(.  
2ee70 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee90 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
2eea0 20 63 6f 64 65 20 2a 2f 0a 20 20 52 65 63 6f 76   code */.  Recov
2eeb0 65 72 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a 20  erTable *pTab,. 
2eec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2eed0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
2eee0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
2eef0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2ef00 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
2ef10 20 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45         /* CREATE
2ef20 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2ef30 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74 6b 65   */.  int bIntke
2ef40 79 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 0a 29  y, .  int nCol.)
2ef50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 74  {.  sqlite3 *dbt
2ef60 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  mp = 0;         
2ef70 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 68      /* sqlite3 h
2ef80 61 6e 64 6c 65 20 66 6f 72 20 74 65 73 74 69 6e  andle for testin
2ef90 67 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  g CREATE TABLE *
2efa0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  /.  int rc = *pR
2efb0 63 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  c;..  if( rc==SQ
2efc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2efd0 6e 74 20 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a  nt nSqlCol = 0;.
2efe0 20 20 20 20 69 6e 74 20 62 53 71 6c 49 6e 74 6b      int bSqlIntk
2eff0 65 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ey = 0;.    sqli
2f000 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
2f010 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  = 0;..    rc = s
2f020 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 22 2c 20  qlite3_open("", 
2f030 26 64 62 74 6d 70 29 3b 0a 20 20 20 20 69 66 28  &dbtmp);.    if(
2f040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f050 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2f060 69 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70 2c  ite3_exec(dbtmp,
2f070 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
2f080 65 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 22 2c 20  e_schema = on", 
2f090 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
2f0a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f0c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2f0d0 28 64 62 74 6d 70 2c 20 7a 53 71 6c 2c 20 30 2c  (dbtmp, zSql, 0,
2f0e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
2f0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
2f100 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OR ){.        rc
2f110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f120 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
2f130 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
2f140 20 7d 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70   }.    shellPrep
2f150 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c  arePrintf(dbtmp,
2f160 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   &rc, &pStmt, . 
2f170 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
2f180 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 72 61  ount(*) FROM pra
2f190 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25  gma_table_info(%
2f1a0 51 29 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29  Q)", zName.    )
2f1b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f1c0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2f1d0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2f1e0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2f1f0 20 20 20 20 6e 53 71 6c 43 6f 6c 20 3d 20 73 71      nSqlCol = sq
2f200 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2f210 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f220 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2f230 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
2f240 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
2f250 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c 43  LITE_OK || nSqlC
2f260 6f 6c 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  ol<nCol ){.     
2f270 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
2f280 20 20 20 20 7d 0a 0a 20 20 20 20 73 68 65 6c 6c      }..    shell
2f290 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62  PreparePrintf(db
2f2a0 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  tmp, &rc, &pStmt
2f2b0 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
2f2c0 20 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c   (".      "  SEL
2f2d0 45 43 54 20 73 75 62 73 74 72 28 64 61 74 61 2c  ECT substr(data,
2f2e0 31 2c 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d  1,1)==X'0D' FROM
2f2f0 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57   sqlite_dbpage W
2f300 48 45 52 45 20 70 67 6e 6f 3d 72 6f 6f 74 70 61  HERE pgno=rootpa
2f310 67 65 22 0a 20 20 20 20 20 20 22 29 20 46 52 4f  ge".      ") FRO
2f320 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2f330 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22  WHERE name = %Q"
2f340 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
2f350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f360 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2f370 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2f380 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
2f390 20 62 53 71 6c 49 6e 74 6b 65 79 20 3d 20 73 71   bSqlIntkey = sq
2f3a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2f3b0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f3c0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2f3d0 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
2f3e0 0a 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65  ..    if( bIntke
2f3f0 79 3d 3d 62 53 71 6c 49 6e 74 6b 65 79 20 29 7b  y==bSqlIntkey ){
2f400 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2f410 72 20 2a 7a 50 6b 20 3d 20 22 5f 72 6f 77 69 64  r *zPk = "_rowid
2f420 5f 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  _";.      sqlite
2f430 33 5f 73 74 6d 74 20 2a 70 50 6b 46 69 6e 64 65  3_stmt *pPkFinde
2f440 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 73 68  r = 0;..      sh
2f450 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2f460 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 50  (dbtmp, &rc, &pP
2f470 6b 46 69 6e 64 65 72 2c 20 0a 20 20 20 20 20 20  kFinder, .      
2f480 20 20 20 20 22 53 45 4c 45 43 54 20 63 69 64 2c      "SELECT cid,
2f490 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d   name FROM pragm
2f4a0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
2f4b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20   ".          "  
2f4c0 57 48 45 52 45 20 70 6b 3d 31 20 41 4e 44 20 74  WHERE pk=1 AND t
2f4d0 79 70 65 3d 27 69 6e 74 65 67 65 72 27 20 43 4f  ype='integer' CO
2f4e0 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
2f4f0 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 4e          "  AND N
2f500 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43  OT EXISTS (SELEC
2f510 54 20 63 69 64 20 46 52 4f 4d 20 70 72 61 67 6d  T cid FROM pragm
2f520 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
2f530 20 57 48 45 52 45 20 70 6b 3d 32 29 22 2c 0a 20   WHERE pk=2)",. 
2f540 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
2f550 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
2f560 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f570 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2f580 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2f590 65 70 28 70 50 6b 46 69 6e 64 65 72 29 20 29 7b  ep(pPkFinder) ){
2f5a0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69  .        pTab->i
2f5b0 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Pk = sqlite3_col
2f5c0 75 6d 6e 5f 69 6e 74 28 70 50 6b 46 69 6e 64 65  umn_int(pPkFinde
2f5d0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  r, 0);.        z
2f5e0 50 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Pk = (const char
2f5f0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2f600 5f 74 65 78 74 28 70 50 6b 46 69 6e 64 65 72 2c  _text(pPkFinder,
2f610 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
2f620 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2f630 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26  = shellMPrintf(&
2f640 72 63 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  rc, "%s", zName)
2f650 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 51  ;.      pTab->zQ
2f660 75 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d 50 72  uoted = shellMPr
2f670 69 6e 74 66 28 26 72 63 2c 20 22 25 51 22 2c 20  intf(&rc, "%Q", 
2f680 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2f690 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c      pTab->azlCol
2f6a0 20 3d 20 28 63 68 61 72 2a 2a 29 73 68 65 6c 6c   = (char**)shell
2f6b0 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65  Malloc(&rc, size
2f6c0 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 53 71 6c  of(char*) * nSql
2f6d0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
2f6e0 2d 3e 6e 43 6f 6c 20 3d 20 6e 53 71 6c 43 6f 6c  ->nCol = nSqlCol
2f6f0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53 71  ;..      if( nSq
2f700 6c 43 6f 6c 3d 3d 31 20 26 26 20 70 54 61 62 2d  lCol==1 && pTab-
2f710 3e 69 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >iPk==0 ){.     
2f720 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b     pTab->azlCol[
2f730 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  0] = shellMPrint
2f740 66 28 26 72 63 2c 20 22 25 51 22 2c 20 7a 50 6b  f(&rc, "%Q", zPk
2f750 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f760 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65          shellPre
2f770 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
2f780 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
2f790 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
2f7a0 54 20 2d 31 2b 72 6f 77 5f 6e 75 6d 62 65 72 28  T -1+row_number(
2f7b0 29 20 20 20 20 20 20 20 20 20 20 4f 56 45 52 20  )          OVER 
2f7c0 28 4f 52 44 45 52 20 42 59 20 63 69 64 29 2c 22  (ORDER BY cid),"
2f7d0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
2f7e0 25 51 7c 7c 25 51 7c 7c 67 72 6f 75 70 5f 63 6f  %Q||%Q||group_co
2f7f0 6e 63 61 74 28 6e 61 6d 65 2c 20 27 2c 20 27 29  ncat(name, ', ')
2f800 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20 63   FILTER (WHERE c
2f810 69 64 21 3d 25 64 29 20 22 0a 20 20 20 20 20 20  id!=%d) ".      
2f820 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20      "           
2f830 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20 63  OVER (ORDER BY c
2f840 69 64 29 20 22 0a 20 20 20 20 20 20 20 20 20 20  id) ".          
2f850 22 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62  "FROM pragma_tab
2f860 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20  le_info(%Q)", . 
2f870 20 20 20 20 20 20 20 20 20 28 62 49 6e 74 6b 65           (bIntke
2f880 79 20 3f 20 7a 50 6b 20 3a 20 22 22 29 2c 20 28  y ? zPk : ""), (
2f890 62 49 6e 74 6b 65 79 20 3f 20 22 2c 20 22 20 3a  bIntkey ? ", " :
2f8a0 20 22 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20   ""), .         
2f8b0 20 70 54 61 62 2d 3e 69 50 6b 2c 20 7a 4e 61 6d   pTab->iPk, zNam
2f8c0 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
2f8d0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2f8e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2f8f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2f900 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
2f910 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 64            int id
2f920 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
2f930 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
2f940 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
2f950 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
2f960 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2f970 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2f980 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2f990 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43        pTab->azlC
2f9a0 6f 6c 5b 69 64 78 5d 20 3d 20 73 68 65 6c 6c 4d  ol[idx] = shellM
2f9b0 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73 22  Printf(&rc, "%s"
2f9c0 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  , zText);.      
2f9d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 68 65 6c    }.        shel
2f9e0 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
2f9f0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Stmt);.      }. 
2fa00 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69       shellFinali
2fa10 7a 65 28 26 72 63 2c 20 70 50 6b 46 69 6e 64 65  ze(&rc, pPkFinde
2fa20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
2fa30 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71 6c 69  finished:.  sqli
2fa40 74 65 33 5f 63 6c 6f 73 65 28 64 62 74 6d 70 29  te3_close(dbtmp)
2fa50 3b 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d  ;.  *pRc = rc;.}
2fa60 0a 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72  ..static Recover
2fa70 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4e 65  Table *recoverNe
2fa80 77 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c 53  wTable(.  ShellS
2fa90 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
2faa0 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 69 6e 74   int *pRc,.  int
2fab0 20 69 52 6f 6f 74 2c 0a 20 20 69 6e 74 20 62 49   iRoot,.  int bI
2fac0 6e 74 6b 65 79 2c 0a 20 20 69 6e 74 20 6e 43 6f  ntkey,.  int nCo
2fad0 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  l.){.  sqlite3_s
2fae0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
2faf0 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a    RecoverTable *
2fb00 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pRet = 0;.  int 
2fb10 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 63 6f 6e  bNoop = 0;.  con
2fb20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
2fb30 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
2fb40 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 70  *zName = 0;..  p
2fb50 52 65 74 20 3d 20 28 52 65 63 6f 76 65 72 54 61  Ret = (RecoverTa
2fb60 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63  ble*)shellMalloc
2fb70 28 70 52 63 2c 20 73 69 7a 65 6f 66 28 52 65 63  (pRc, sizeof(Rec
2fb80 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a 20 20 69  overTable));.  i
2fb90 66 28 20 70 52 65 74 20 29 20 70 52 65 74 2d 3e  f( pRet ) pRet->
2fba0 69 50 6b 20 3d 20 2d 32 3b 0a 0a 20 20 2f 2a 20  iPk = -2;..  /* 
2fbb0 53 65 61 72 63 68 20 74 68 65 20 72 65 63 6f 76  Search the recov
2fbc0 65 72 65 64 20 73 63 68 65 6d 61 20 66 6f 72 20  ered schema for 
2fbd0 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68 20 72  an object with r
2fbe0 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot page iRoot. 
2fbf0 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  */.  shellPrepar
2fc00 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
2fc10 64 62 2c 20 70 52 63 2c 20 26 70 53 74 6d 74 2c  db, pRc, &pStmt,
2fc20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74  .      "SELECT t
2fc30 79 70 65 2c 20 6e 61 6d 65 2c 20 73 71 6c 20 46  ype, name, sql F
2fc40 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68  ROM recovery.sch
2fc50 65 6d 61 20 57 48 45 52 45 20 72 6f 6f 74 70 61  ema WHERE rootpa
2fc60 67 65 3d 25 64 22 2c 20 69 52 6f 6f 74 0a 20 20  ge=%d", iRoot.  
2fc70 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 52 63  );.  while( *pRc
2fc80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2fc90 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2fca0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2fcb0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2fcc0 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74   *zType = (const
2fcd0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2fce0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2fcf0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 49  , 0);.    if( bI
2fd00 6e 74 6b 65 79 3d 3d 30 20 26 26 20 73 71 6c 69  ntkey==0 && sqli
2fd10 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70  te3_stricmp(zTyp
2fd20 65 2c 20 22 69 6e 64 65 78 22 29 3d 3d 30 20 29  e, "index")==0 )
2fd30 7b 0a 20 20 20 20 20 20 62 4e 6f 6f 70 20 3d 20  {.      bNoop = 
2fd40 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2fd50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
2fd60 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2fd70 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
2fd80 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
2fd90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2fda0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2fdb0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
2fdc0 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73      zSql = (cons
2fdd0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2fde0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2fdf0 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 72 65 63  t, 2);.      rec
2fe00 6f 76 65 72 4f 6c 64 54 61 62 6c 65 28 70 52 63  overOldTable(pRc
2fe10 2c 20 70 52 65 74 2c 20 7a 4e 61 6d 65 2c 20 7a  , pRet, zName, z
2fe20 53 71 6c 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43  Sql, bIntkey, nC
2fe30 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
2fe40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68  ;.    }.  }.  sh
2fe50 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c  ellFinalize(pRc,
2fe60 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 62   pStmt);.  if( b
2fe70 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Noop ){.    sqli
2fe80 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
2fe90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2fea0 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 20 26 26  }..  if( pRet &&
2feb0 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 3d 3d 30 20   pRet->zName==0 
2fec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2fed0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
2fee0 0a 20 20 20 20 70 52 65 74 2d 3e 7a 4e 61 6d 65  .    pRet->zName
2fef0 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
2ff00 70 52 63 2c 20 22 6f 72 70 68 61 6e 5f 25 64 5f  pRc, "orphan_%d_
2ff10 25 64 22 2c 20 6e 43 6f 6c 2c 20 69 52 6f 6f 74  %d", nCol, iRoot
2ff20 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 7a 51 75  );.    pRet->zQu
2ff30 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d 50 72 69  oted = shellMPri
2ff40 6e 74 66 28 70 52 63 2c 20 22 25 51 22 2c 20 70  ntf(pRc, "%Q", p
2ff50 52 65 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Ret->zName);.   
2ff60 20 70 52 65 74 2d 3e 61 7a 6c 43 6f 6c 20 3d 20   pRet->azlCol = 
2ff70 28 63 68 61 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c  (char**)shellMal
2ff80 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65 6f 66 28  loc(pRc, sizeof(
2ff90 63 68 61 72 2a 29 20 2a 20 6e 43 6f 6c 29 3b 0a  char*) * nCol);.
2ffa0 20 20 20 20 70 52 65 74 2d 3e 6e 43 6f 6c 20 3d      pRet->nCol =
2ffb0 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 73 68 65 6c   nCol;..    shel
2ffc0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
2ffd0 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c 20  State->db, pRc, 
2ffe0 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 22  &pStmt, .      "
2fff0 57 49 54 48 20 73 28 69 29 20 41 53 20 28 22 0a  WITH s(i) AS (".
30000 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
30010 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
30020 43 54 20 69 2b 31 20 46 52 4f 4d 20 73 20 57 48  CT i+1 FROM s WH
30030 45 52 45 20 69 3c 25 64 22 0a 20 20 20 20 20 20  ERE i<%d".      
30040 22 29 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ")".      "SELEC
30050 54 20 69 2d 31 2c 20 25 51 20 7c 7c 20 67 72 6f  T i-1, %Q || gro
30060 75 70 5f 63 6f 6e 63 61 74 28 27 63 27 20 7c 7c  up_concat('c' ||
30070 20 69 2c 20 27 2c 20 27 29 20 4f 56 45 52 20 28   i, ', ') OVER (
30080 4f 52 44 45 52 20 42 59 20 69 29 20 46 52 4f 4d  ORDER BY i) FROM
30090 20 73 22 2c 0a 20 20 20 20 20 20 6e 43 6f 6c 2c   s",.      nCol,
300a0 20 28 62 49 6e 74 6b 65 79 20 3f 20 22 69 64 2c   (bIntkey ? "id,
300b0 20 22 20 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a   " : "").    );.
300c0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 52 63 3d      while( *pRc=
300d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
300e0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
300f0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
30100 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
30110 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
30120 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
30130 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
30140 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
30150 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
30160 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
30170 20 31 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d   1);.      pRet-
30180 3e 61 7a 6c 43 6f 6c 5b 69 64 78 5d 20 3d 20 73  >azlCol[idx] = s
30190 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
301a0 20 22 25 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20   "%s", zText);. 
301b0 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
301c0 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 53 74 6d  nalize(pRc, pStm
301d0 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 52  t);..    if( *pR
301e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
301f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65        char *zCre
30200 61 74 65 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e  ate = shellMPrin
30210 74 66 28 70 52 63 2c 20 22 43 52 45 41 54 45 20  tf(pRc, "CREATE 
30220 54 41 42 4c 45 20 25 51 20 28 25 73 29 22 2c 20  TABLE %Q (%s)", 
30230 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 7a  .        pRet->z
30240 4e 61 6d 65 2c 20 70 52 65 74 2d 3e 61 7a 6c 43  Name, pRet->azlC
30250 6f 6c 5b 6e 43 6f 6c 2d 31 5d 0a 20 20 20 20 20  ol[nCol-1].     
30260 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   );.      if( zC
30270 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  reate ){.       
30280 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
30290 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  te->out, "%s;\n"
302a0 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20  , zCreate);.    
302b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
302c0 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20  (zCreate);.     
302d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
302e0 69 66 28 20 2a 70 52 63 21 3d 53 51 4c 49 54 45  if( *pRc!=SQLITE
302f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 63 6f 76  _OK ){.    recov
30300 65 72 46 72 65 65 54 61 62 6c 65 28 70 52 65 74  erFreeTable(pRet
30310 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
30320 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
30330 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
30340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30350 61 6c 6c 65 64 20 74 6f 20 72 65 63 6f 76 65 72  alled to recover
30360 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
30370 61 74 61 62 61 73 65 2e 20 41 20 73 63 72 69 70  atabase. A scrip
30380 74 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74 72 75 63  t.** to construc
30390 74 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  t a new database
303a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
303b0 72 65 63 6f 76 65 72 65 64 20 64 61 74 61 20 69  recovered data i
303c0 73 20 6f 75 74 70 75 74 0a 2a 2a 20 6f 6e 20 73  s output.** on s
303d0 74 72 65 61 6d 20 70 53 74 61 74 65 2d 3e 6f 75  tream pState->ou
303e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
303f0 20 72 65 63 6f 76 65 72 44 61 74 61 62 61 73 65   recoverDatabase
30400 43 6d 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  Cmd(ShellState *
30410 70 53 74 61 74 65 2c 20 69 6e 74 20 6e 41 72 67  pState, int nArg
30420 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
30430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30440 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
30450 5f 73 74 6d 74 20 2a 70 4c 6f 6f 70 20 3d 20 30  _stmt *pLoop = 0
30460 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  ;        /* Loop
30470 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 6f   through all roo
30480 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c  t pages */.  sql
30490 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 61 67 65  ite3_stmt *pPage
304a0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  s = 0;       /* 
304b0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
304c0 20 70 61 67 65 73 20 69 6e 20 61 20 67 72 6f 75   pages in a grou
304d0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  p */.  sqlite3_s
304e0 74 6d 74 20 2a 70 43 65 6c 6c 73 20 3d 20 30 3b  tmt *pCells = 0;
304f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
30500 68 72 6f 75 67 68 20 61 6c 6c 20 63 65 6c 6c 73  hrough all cells
30510 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20   in a page */.. 
30520 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74   shellExec(pStat
30530 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
30540 20 2f 2a 20 41 74 74 61 63 68 20 61 6e 20 69 6e   /* Attach an in
30550 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
30560 20 6e 61 6d 65 64 20 27 72 65 63 6f 76 65 72 79   named 'recovery
30570 27 2e 20 43 72 65 61 74 65 20 61 6e 20 69 6e 64  '. Create an ind
30580 65 78 65 64 20 0a 20 20 20 20 2a 2a 20 63 61 63  exed .    ** cac
30590 68 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  he of the sqlite
305a0 5f 64 62 70 74 72 20 76 69 72 74 75 61 6c 20 74  _dbptr virtual t
305b0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 22 41 54  able. */.    "AT
305c0 54 41 43 48 20 27 27 20 41 53 20 72 65 63 6f 76  TACH '' AS recov
305d0 65 72 79 3b 22 0a 20 20 20 20 22 43 52 45 41 54  ery;".    "CREAT
305e0 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
305f0 2e 64 62 70 74 72 28 22 0a 20 20 20 20 22 20 20  .dbptr(".    "  
30600 20 20 20 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c      pgno, child,
30610 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 68 69   PRIMARY KEY(chi
30620 6c 64 2c 20 70 67 6e 6f 29 22 0a 20 20 20 20 22  ld, pgno)".    "
30630 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
30640 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  ".    "INSERT OR
30650 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 64 62 70   IGNORE INTO dbp
30660 74 72 28 70 67 6e 6f 2c 20 63 68 69 6c 64 29 20  tr(pgno, child) 
30670 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
30680 6c 69 74 65 5f 64 62 70 74 72 3b 22 0a 0a 20 20  lite_dbptr;"..  
30690 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
306a0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
306b0 31 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  1. This ensures 
306c0 74 68 61 74 20 70 61 67 65 20 31 20 69 73 20 63  that page 1 is c
306d0 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20 2a 2a  onsidered.    **
306e0 20 61 20 72 6f 6f 74 20 70 61 67 65 2c 20 72 65   a root page, re
306f0 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f 77 20  gardless of how 
30700 63 6f 72 72 75 70 74 20 74 68 65 20 64 62 20 69  corrupt the db i
30710 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45 54  s. */.    "DELET
30720 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  E FROM recovery.
30730 64 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c  dbptr WHERE chil
30740 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f 2a 20  d = 1;"..    /* 
30750 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69 6e 74  Delete all point
30760 65 72 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ers to any pages
30770 20 74 68 61 74 20 68 61 76 65 20 6d 6f 72 65 20   that have more 
30780 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74 65 72  than one pointer
30790 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 6d 2e  .    ** to them.
307a0 20 53 75 63 68 20 70 61 67 65 73 20 77 69 6c 6c   Such pages will
307b0 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 72   be treated as r
307c0 6f 6f 74 20 70 61 67 65 73 20 77 68 65 6e 20 72  oot pages when r
307d0 65 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a  ecovering.    **
307e0 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 22   data.  */.    "
307f0 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 63 6f  DELETE FROM reco
30800 76 65 72 79 2e 64 62 70 74 72 20 57 48 45 52 45  very.dbptr WHERE
30810 20 63 68 69 6c 64 20 49 4e 20 28 22 0a 20 20 20   child IN (".   
30820 20 22 20 20 53 45 4c 45 43 54 20 63 68 69 6c 64   "  SELECT child
30830 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
30840 62 70 74 72 20 47 52 4f 55 50 20 42 59 20 63 68  bptr GROUP BY ch
30850 69 6c 64 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  ild HAVING count
30860 28 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b 22 0a  (*)>1".    ");".
30870 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
30880 68 65 20 22 6d 61 70 22 20 74 61 62 6c 65 20 74  he "map" table t
30890 68 61 74 20 77 69 6c 6c 20 28 65 76 65 6e 74 75  hat will (eventu
308a0 61 6c 6c 79 29 20 63 6f 6e 74 61 69 6e 20 69 6e  ally) contain in
308b0 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a  structions.    *
308c0 2a 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69  * for dealing wi
308d0 74 68 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  th each page in 
308e0 74 68 65 20 64 62 20 74 68 61 74 20 63 6f 6e 74  the db that cont
308f0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
30900 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73   .    ** records
30910 2e 20 2a 2f 0a 20 20 20 20 22 43 52 45 41 54 45  . */.    "CREATE
30920 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e   TABLE recovery.
30930 6d 61 70 28 22 0a 20 20 20 20 20 20 22 70 67 6e  map(".      "pgn
30940 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
30950 59 20 4b 45 59 2c 20 6d 61 78 6c 65 6e 20 49 4e  Y KEY, maxlen IN
30960 54 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f 74 20  T, intkey, root 
30970 49 4e 54 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20  INT".    ");".. 
30980 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
30990 61 62 6c 65 20 5b 6d 61 70 5d 2e 20 49 66 20 74  able [map]. If t
309a0 68 65 72 65 20 61 72 65 20 63 69 72 63 75 6c 61  here are circula
309b0 72 20 6c 6f 6f 70 73 20 6f 66 20 70 61 67 65 73  r loops of pages
309c0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   in the.    ** d
309d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 6f 6c  atabase, the fol
309e0 6c 6f 77 69 6e 67 20 61 64 64 73 20 61 6c 6c 20  lowing adds all 
309f0 70 61 67 65 73 20 69 6e 20 73 75 63 68 20 61 20  pages in such a 
30a00 6c 6f 6f 70 20 74 6f 20 74 68 65 20 6d 61 70 0a  loop to the map.
30a10 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 69 76 69      ** as indivi
30a20 64 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 73 2e  dual root pages.
30a30 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 20 68   This could be h
30a40 61 6e 64 6c 65 64 20 62 65 74 74 65 72 2e 20 20  andled better.  
30a50 2a 2f 0a 20 20 20 20 22 57 49 54 48 20 70 61 67  */.    "WITH pag
30a60 65 73 28 69 2c 20 6d 61 78 6c 65 6e 29 20 41 53  es(i, maxlen) AS
30a70 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43   (".    "  SELEC
30a80 54 20 70 61 67 65 5f 63 6f 75 6e 74 2c 20 28 22  T page_count, ("
30a90 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
30aa0 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20 46 52   max(field+1) FR
30ab0 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61  OM sqlite_dbdata
30ac0 20 57 48 45 52 45 20 70 67 6e 6f 3d 70 61 67 65   WHERE pgno=page
30ad0 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22 20 20 29  _count".    "  )
30ae0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67   FROM pragma_pag
30af0 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22 20 20  e_count".    "  
30b00 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20    UNION ALL".   
30b10 20 22 20 20 53 45 4c 45 43 54 20 69 2d 31 2c 20   "  SELECT i-1, 
30b20 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  (".    "    SELE
30b30 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20  CT max(field+1) 
30b40 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61  FROM sqlite_dbda
30b50 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 69 2d  ta WHERE pgno=i-
30b60 31 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f 4d  1".    "  ) FROM
30b70 20 70 61 67 65 73 20 57 48 45 52 45 20 69 3e 3d   pages WHERE i>=
30b80 32 22 0a 20 20 20 20 22 29 22 0a 20 20 20 20 22  2".    ")".    "
30b90 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63 6f  INSERT INTO reco
30ba0 76 65 72 79 2e 6d 61 70 28 70 67 6e 6f 2c 20 6d  very.map(pgno, m
30bb0 61 78 6c 65 6e 2c 20 69 6e 74 6b 65 79 2c 20 72  axlen, intkey, r
30bc0 6f 6f 74 29 20 22 0a 20 20 20 20 22 20 20 53 45  oot) ".    "  SE
30bd0 4c 45 43 54 20 69 2c 20 6d 61 78 6c 65 6e 2c 20  LECT i, maxlen, 
30be0 4e 55 4c 4c 2c 20 28 22 0a 20 20 20 20 22 20 20  NULL, (".    "  
30bf0 20 20 57 49 54 48 20 70 28 6f 72 69 67 2c 20 70    WITH p(orig, p
30c00 67 6e 6f 2c 20 70 61 72 65 6e 74 29 20 41 53 20  gno, parent) AS 
30c10 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 53 45  (".    "      SE
30c20 4c 45 43 54 20 30 2c 20 69 2c 20 28 53 45 4c 45  LECT 0, i, (SELE
30c30 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63  CT pgno FROM rec
30c40 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45 52  overy.dbptr WHER
30c50 45 20 63 68 69 6c 64 3d 69 29 22 0a 20 20 20 20  E child=i)".    
30c60 22 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  "        UNION A
30c70 4c 4c 22 0a 20 20 20 20 22 20 20 20 20 20 20 53  LL".    "      S
30c80 45 4c 45 43 54 20 69 2c 20 70 2e 70 61 72 65 6e  ELECT i, p.paren
30c90 74 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 20  t, ".    "      
30ca0 20 20 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46    (SELECT pgno F
30cb0 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70  ROM recovery.dbp
30cc0 74 72 20 57 48 45 52 45 20 63 68 69 6c 64 3d 70  tr WHERE child=p
30cd0 2e 70 61 72 65 6e 74 29 20 46 52 4f 4d 20 70 22  .parent) FROM p"
30ce0 0a 20 20 20 20 22 20 20 20 20 29 22 0a 20 20 20  .    "    )".   
30cf0 20 22 20 20 20 20 53 45 4c 45 43 54 20 70 67 6e   "    SELECT pgn
30d00 6f 20 46 52 4f 4d 20 70 20 57 48 45 52 45 20 28  o FROM p WHERE (
30d10 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 4f  parent IS NULL O
30d20 52 20 70 67 6e 6f 20 3d 20 6f 72 69 67 29 22 0a  R pgno = orig)".
30d30 20 20 20 20 22 29 20 22 0a 20 20 20 20 22 46 52      ") ".    "FR
30d40 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45 20 6d  OM pages WHERE m
30d50 61 78 6c 65 6e 20 3e 20 30 3b 22 0a 20 20 20 20  axlen > 0;".    
30d60 22 55 50 44 41 54 45 20 72 65 63 6f 76 65 72 79  "UPDATE recovery
30d70 2e 6d 61 70 20 41 53 20 6f 20 53 45 54 20 69 6e  .map AS o SET in
30d80 74 6b 65 79 20 3d 20 28 22 0a 20 20 20 20 22 20  tkey = (".    " 
30d90 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 64   SELECT substr(d
30da0 61 74 61 2c 20 31 2c 20 31 29 3d 3d 58 27 30 44  ata, 1, 1)==X'0D
30db0 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  ' FROM sqlite_db
30dc0 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d  page WHERE pgno=
30dd0 6f 2e 70 67 6e 6f 22 0a 20 20 20 20 22 29 3b 22  o.pgno".    ");"
30de0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
30df0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
30e00 31 20 61 6e 64 20 61 6e 79 20 6c 69 6e 6b 65 64  1 and any linked
30e10 20 70 61 67 65 73 20 69 6e 74 6f 20 74 61 62 6c   pages into tabl
30e20 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 76 65 72  e.    ** recover
30e30 79 2e 73 63 68 65 6d 61 2e 20 57 69 74 68 20 74  y.schema. With t
30e40 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
30e50 73 20 61 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  s an sqlite_mast
30e60 65 72 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  er table.  */.  
30e70 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
30e80 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 28  recovery.schema(
30e90 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f  type, name, tbl_
30ea0 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20  name, rootpage, 
30eb0 73 71 6c 29 3b 22 0a 20 20 20 20 22 49 4e 53 45  sql);".    "INSE
30ec0 52 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79  RT INTO recovery
30ed0 2e 73 63 68 65 6d 61 20 53 45 4c 45 43 54 20 22  .schema SELECT "
30ee0 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45  .    "  max(CASE
30ef0 20 57 48 45 4e 20 66 69 65 6c 64 3d 30 20 54 48   WHEN field=0 TH
30f00 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55  EN value ELSE NU
30f10 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20  LL END),".    " 
30f20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66   max(CASE WHEN f
30f30 69 65 6c 64 3d 31 20 54 48 45 4e 20 76 61 6c 75  ield=1 THEN valu
30f40 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29  e ELSE NULL END)
30f50 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41  ,".    "  max(CA
30f60 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 32 20  SE WHEN field=2 
30f70 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20  THEN value ELSE 
30f80 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20  NULL END),".    
30f90 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e  "  max(CASE WHEN
30fa0 20 66 69 65 6c 64 3d 33 20 54 48 45 4e 20 76 61   field=3 THEN va
30fb0 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e  lue ELSE NULL EN
30fc0 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28  D),".    "  max(
30fd0 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d  CASE WHEN field=
30fe0 34 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53  4 THEN value ELS
30ff0 45 20 4e 55 4c 4c 20 45 4e 44 29 22 0a 20 20 20  E NULL END)".   
31000 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62   "FROM sqlite_db
31010 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 20  data WHERE pgno 
31020 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  IN (".    "  SEL
31030 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65  ECT pgno FROM re
31040 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45  covery.map WHERE
31050 20 72 6f 6f 74 3d 31 22 0a 20 20 20 20 22 29 22   root=1".    ")"
31060 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 70  .    "GROUP BY p
31070 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20 20 29 3b  gno, cell;".  );
31080 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72  ..  /* Open a tr
31090 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
310a0 70 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20 6e 6f  print out all no
310b0 6e 2d 76 69 72 74 75 61 6c 2c 20 6e 6f 6e 2d 22  n-virtual, non-"
310c0 73 71 6c 69 74 65 5f 25 22 20 0a 20 20 2a 2a 20  sqlite_%" .  ** 
310d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
310e0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 65 78 74  tements that ext
310f0 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
31100 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 2e  existing schema.
31110 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
31120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31130 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
31140 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 61 77  tmt = 0;.    raw
31150 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
31160 6f 75 74 2c 20 22 42 45 47 49 4e 3b 5c 6e 22 29  out, "BEGIN;\n")
31170 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
31180 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50  (pState->out, "P
31190 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
311a0 63 68 65 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b  chema = on;\n");
311b0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
311c0 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  e(pState->db, &r
311d0 63 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  c,.        "SELE
311e0 43 54 20 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f  CT sql FROM reco
311f0 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20  very.schema ".  
31200 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
31210 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71  e='table' AND sq
31220 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20 74  l LIKE 'create t
31230 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74 0a  able%'", &pStmt.
31240 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
31250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31260 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
31270 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
31280 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  t) ){.      cons
31290 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
312a0 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  able = (const ch
312b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
312c0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
312d0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
312e0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
312f0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
31300 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 3b  F NOT EXISTS %s;
31310 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
31320 26 7a 43 72 65 61 74 65 54 61 62 6c 65 5b 31 32  &zCreateTable[12
31330 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ].      );.    }
31340 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
31350 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
31360 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
31370 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
31380 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  &rc,.      "SELE
31390 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63  CT pgno FROM rec
313a0 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20  overy.map WHERE 
313b0 72 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67 65 73  root=?", &pPages
313c0 0a 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65  .  );.  shellPre
313d0 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c  pare(pState->db,
313e0 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c   &rc,.      "SEL
313f0 45 43 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20  ECT max(field), 
31400 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65  group_concat(she
31410 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71  ll_escape_crnl(q
31420 75 6f 74 65 28 76 61 6c 75 65 29 29 2c 20 27 2c  uote(value)), ',
31430 20 27 29 22 0a 20 20 20 20 20 20 22 46 52 4f 4d   ')".      "FROM
31440 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57   sqlite_dbdata W
31450 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20 41 4e  HERE pgno = ? AN
31460 44 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a 20 20  D field != ?".  
31470 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 65      "GROUP BY ce
31480 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20 20 29  ll", &pCells.  )
31490 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  ;..  /* Loop thr
314a0 6f 75 67 68 20 65 61 63 68 20 72 6f 6f 74 20 70  ough each root p
314b0 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50  age. */.  shellP
314c0 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64  repare(pState->d
314d0 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22  b, &rc, .      "
314e0 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69 6e 74  SELECT root, int
314f0 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65 6e 29  key, max(maxlen)
31500 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d   FROM recovery.m
31510 61 70 22 20 0a 20 20 20 20 20 20 22 20 57 48 45  ap" .      " WHE
31520 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55 50 20  RE root>1 GROUP 
31530 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65 79 20  BY root, intkey 
31540 4f 52 44 45 52 20 42 59 20 72 6f 6f 74 3d 28 22  ORDER BY root=("
31550 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
31560 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 72   rootpage FROM r
31570 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57  ecovery.schema W
31580 48 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c 69 74  HERE name='sqlit
31590 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
315a0 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70 0a 20     ")", &pLoop. 
315b0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
315c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
315d0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
315e0 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20 29 7b  3_step(pLoop) ){
315f0 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d  .    int iRoot =
31600 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
31610 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b 0a 20  int(pLoop, 0);. 
31620 20 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 20 3d     int bIntkey =
31630 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
31640 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b 0a 20  int(pLoop, 1);. 
31650 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
31660 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
31670 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20 20 20  (pLoop, 2);.    
31680 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54  RecoverTable *pT
31690 61 62 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20  ab;..    pTab = 
316a0 72 65 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28  recoverNewTable(
316b0 70 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f  pState, &rc, iRo
316c0 6f 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f  ot, bIntkey, nCo
316d0 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  l);.    if( pTab
316e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
316f0 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
31700 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
31710 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
31720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
31730 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
31740 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
31750 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
31760 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ;\n");.      }. 
31770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
31780 64 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 31 2c  d_int(pPages, 1,
31790 20 69 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 73   iRoot);.      s
317a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
317b0 70 43 65 6c 6c 73 2c 20 32 2c 20 70 54 61 62 2d  pCells, 2, pTab-
317c0 3e 69 50 6b 29 3b 0a 20 20 20 20 20 20 77 68 69  >iPk);.      whi
317d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
317e0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
317f0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50  =sqlite3_step(pP
31800 61 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ages) ){.       
31810 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
31820 74 28 70 43 65 6c 6c 73 2c 20 31 2c 20 73 71 6c  t(pCells, 1, sql
31830 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
31840 70 50 61 67 65 73 2c 20 30 29 29 3b 0a 20 20 20  pPages, 0));.   
31850 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
31860 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
31870 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
31880 5f 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b  _step(pCells) ){
31890 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
318a0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Max = sqlite3_co
318b0 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c  lumn_int(pCells,
318c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   0);.          c
318d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20  onst char *zVal 
318e0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
318f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
31900 78 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 20  xt(pCells, 1);. 
31910 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
31920 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
31930 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73   "INSERT INTO %s
31940 28 25 73 29 20 56 41 4c 55 45 53 28 20 25 73 20  (%s) VALUES( %s 
31950 29 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  );\n", .        
31960 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f        pTab->zQuo
31970 74 65 64 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f  ted, pTab->azlCo
31980 6c 5b 69 4d 61 78 3e 30 3f 69 4d 61 78 3a 30 5d  l[iMax>0?iMax:0]
31990 2c 20 7a 56 61 6c 0a 20 20 20 20 20 20 20 20 20  , zVal.         
319a0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
319b0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
319c0 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20  (&rc, pCells);. 
319d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
319e0 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 50 61  llReset(&rc, pPa
319f0 67 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ges);.    }.    
31a00 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65  recoverFreeTable
31a10 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 68  (pTab);.  }.  sh
31a20 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
31a30 20 70 4c 6f 6f 70 29 3b 0a 20 20 73 68 65 6c 6c   pLoop);.  shell
31a40 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50  Finalize(&rc, pP
31a50 61 67 65 73 29 3b 0a 20 20 73 68 65 6c 6c 46 69  ages);.  shellFi
31a60 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 43 65 6c  nalize(&rc, pCel
31a70 6c 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  ls);..  /* The r
31a80 65 73 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  est of the schem
31a90 61 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  a */.  if( rc==S
31aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31ab0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
31ac0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65  tmt = 0;.    she
31ad0 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65  llPrepare(pState
31ae0 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20  ->db, &rc, .    
31af0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 2c      "SELECT sql,
31b00 20 6e 61 6d 65 20 46 52 4f 4d 20 72 65 63 6f 76   name FROM recov
31b10 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20  ery.schema ".   
31b20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
31b30 4e 4f 54 20 4c 49 4b 45 20 27 63 72 65 61 74 65  NOT LIKE 'create
31b40 20 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d   table%'", &pStm
31b50 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69  t.    );.    whi
31b60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
31b70 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
31b80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
31b90 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  tmt) ){.      co
31ba0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
31bb0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
31bc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
31bd0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
31be0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
31bf0 74 72 6e 69 63 6d 70 28 7a 53 71 6c 2c 20 22 63  trnicmp(zSql, "c
31c00 72 65 61 74 65 20 76 69 72 74 22 2c 20 31 31 29  reate virt", 11)
31c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
31c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
31c30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
31c40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31c50 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
31c60 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72         char *zPr
31c70 69 6e 74 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e  int = shellMPrin
31c80 74 66 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  tf(&rc, .       
31c90 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
31ca0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41  sqlite_master VA
31cb0 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 20 25 51  LUES('table', %Q
31cc0 2c 20 25 51 2c 20 30 2c 20 25 51 29 22 2c 0a 20  , %Q, 0, %Q)",. 
31cd0 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
31ce0 7a 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20 20 20 20  zName, zSql.    
31cf0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72      );.        r
31d00 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
31d10 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
31d20 7a 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  zPrint);.       
31d30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
31d40 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rint);.      }el
31d50 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
31d60 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
31d70 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
31d80 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
31d90 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
31da0 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
31db0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
31dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31dd0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
31de0 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41  te->out, "PRAGMA
31df0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
31e00 20 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a 20 20 20   = off;\n");.   
31e10 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
31e20 74 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49 54  te->out, "COMMIT
31e30 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ;\n");.  }.  sql
31e40 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65  ite3_exec(pState
31e50 2d 3e 64 62 2c 20 22 44 45 54 41 43 48 20 72 65  ->db, "DETACH re
31e60 63 6f 76 65 72 79 22 2c 20 30 2c 20 30 2c 20 30  covery", 0, 0, 0
31e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31e80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  }.../*.** If an 
31e90 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e  input line begin
31ea0 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20  s with "." then 
31eb0 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
31ec0 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73  ine to.** proces
31ed0 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  s that line..**.
31ee0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
31ef0 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
31f00 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
31f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31f20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
31f30 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65  char *zLine, She
31f40 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
31f50 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nt h = 1;.  int 
31f60 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nArg = 0;.  int 
31f70 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d  n, c;.  int rc =
31f80 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   0;.  char *azAr
31f90 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20  g[50];..#ifndef 
31fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
31fb0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
31fc0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
31fd0 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69   ){.    expertFi
31fe0 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20  nish(p, 1, 0);. 
31ff0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32000 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
32010 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
32020 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
32030 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67  zLine[h] && nArg
32040 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
32050 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
32060 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
32070 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
32080 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20  if( zLine[h]==0 
32090 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
320a0 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20   zLine[h]=='\'' 
320b0 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27  || zLine[h]=='"'
320c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65   ){.      int de
320d0 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  lim = zLine[h++]
320e0 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  ;.      azArg[nA
320f0 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
32100 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
32110 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e  zLine[h] && zLin
32120 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]!=delim ){. 
32130 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
32140 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [h]=='\\' && del
32150 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
32160 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a  [h+1]!=0 ) h++;.
32170 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20          h++;.   
32180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
32190 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
321a0 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
321b0 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
321c0 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
321d0 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
321e0 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
321f0 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
32200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
32210 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
32220 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
32230 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
32240 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
32250 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
32260 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
32270 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
32280 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
32290 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
322a0 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
322b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
322c0 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
322d0 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
322e0 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
322f0 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
32300 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
32310 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
32320 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
32330 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c  zArg[0][0];.  cl
32340 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a  earTempFile(p);.
32350 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32360 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
32370 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  ON.  if( c=='a' 
32380 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32390 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d  [0], "auth", n)=
323a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
323b0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
323c0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
323d0 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20  , "Usage: .auth 
323e0 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20  ON|OFF\n");.    
323f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32400 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
32410 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
32420 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
32430 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  .    if( boolean
32440 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
32450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32460 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
32470 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68  p->db, shellAuth
32480 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
32490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
324a0 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
324b0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
324c0 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
324d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
324e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
324f0 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
32500 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
32510 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  ZLIB).  if( c=='
32520 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
32530 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65  Arg[0], "archive
32540 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32550 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
32560 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
32570 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67  mand(p, 0, azArg
32580 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
32590 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28  .#endif..  if( (
325a0 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
325b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
325c0 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29  0], "backup", n)
325d0 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  ==0).   || (c=='
325e0 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  s' && n>=3 && st
325f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32600 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20  "save", n)==0). 
32610 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
32620 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20  ar *zDestFile = 
32630 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
32640 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20  r *zDb = 0;.    
32650 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
32660 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
32670 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
32680 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20   int j;.    int 
32690 62 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  bAsync = 0;.    
326a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
326b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
326c0 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b  1; j<nArg; j++){
326d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
326e0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  r *z = azArg[j];
326f0 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
32700 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
32710 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20  if( z[1]=='-' ) 
32720 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
32730 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70   strcmp(z, "-app
32740 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  end")==0 ){.    
32750 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61 70        zVfs = "ap
32760 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20 20  ndvfs";.        
32770 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
32780 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 73  ( strcmp(z, "-as
32790 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ync")==0 ){.    
327a0 20 20 20 20 20 20 62 41 73 79 6e 63 20 3d 20 31        bAsync = 1
327b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
327c0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
327d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
327e0 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
327f0 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
32800 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20  azArg[j]);.     
32810 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
32820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32830 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69  else if( zDestFi
32840 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
32850 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
32860 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
32870 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  se if( zDb==0 ){
32880 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a  .        zDb = z
32890 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20  DestFile;.      
328a0 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
328b0 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65  Arg[j];.      }e
328c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77  lse{.        raw
328d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
328e0 22 55 73 61 67 65 3a 20 2e 62 61 63 6b 75 70 20  "Usage: .backup 
328f0 3f 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f 20 46  ?DB? ?OPTIONS? F
32900 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
32910 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
32920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32930 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
32940 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
32950 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d  rintf(stderr, "m
32960 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20  issing FILENAME 
32970 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63  argument on .bac
32980 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  kup\n");.      r
32990 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
329a0 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20     if( zDb==0 ) 
329b0 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
329c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
329d0 70 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65  pen_v2(zDestFile
329e0 2c 20 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20  , &pDest, .     
329f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
32a00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
32a10 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
32a20 52 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20  REATE, zVfs);.  
32a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
32a50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
32a60 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
32a70 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
32a80 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20  zDestFile);.    
32a90 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74    close_db(pDest
32aa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
32ab0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
32ac0 20 62 41 73 79 6e 63 20 29 7b 0a 20 20 20 20 20   bAsync ){.     
32ad0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
32ae0 65 73 74 2c 20 22 50 52 41 47 4d 41 20 73 79 6e  est, "PRAGMA syn
32af0 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20 50 52  chronous=OFF; PR
32b00 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
32b10 65 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20 20 20  e=OFF;",.       
32b20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
32b30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
32b40 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
32b50 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
32b60 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
32b70 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
32b80 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  p->db, zDb);.   
32b90 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
32ba0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
32bb0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
32bc0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
32bd0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
32be0 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
32bf0 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
32c00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
32c10 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
32c20 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
32c30 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
32c40 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
32c50 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
32c60 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
32c70 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
32c80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
32c90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
32ca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32cb0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32cc0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
32cd0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
32ce0 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
32cf0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
32d00 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44  .    close_db(pD
32d10 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
32d20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
32d30 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
32d40 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c  zArg[0], "bail",
32d50 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
32d60 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
32d70 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72     bail_on_error
32d80 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
32d90 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
32da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
32db0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32dc0 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c  Usage: .bail on|
32dd0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
32de0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
32df0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
32e00 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
32e10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32e20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20  "binary", n)==0 
32e30 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
32e40 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
32e50 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
32e60 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
32e70 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
32e80 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
32e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32ea0 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e   setTextMode(p->
32eb0 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  out, 1);.      }
32ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32ed0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
32ee0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69  err, "Usage: .bi
32ef0 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nary on|off\n");
32f00 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32f10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
32f20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
32f30 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63  rcmp(azArg[0],"c
32f40 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  d")==0 ){.    if
32f50 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66  ( nArg==2 ){.#if
32f60 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
32f70 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
32f80 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74  2).      wchar_t
32f90 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69   *z = sqlite3_wi
32fa0 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
32fb0 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ode(azArg[1]);. 
32fc0 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75       rc = !SetCu
32fd0 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28  rrentDirectoryW(
32fe0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
32ff0 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
33000 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69  .      rc = chdi
33010 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e  r(azArg[1]);.#en
33020 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
33030 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
33040 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33050 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74  "Cannot change t
33060 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73  o directory \"%s
33070 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
33080 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
33090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
330a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
330b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
330c0 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54  sage: .cd DIRECT
330d0 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ORY\n");.      r
330e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
330f0 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75  else..  /* The u
33100 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72  ndocumented ".br
33110 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e  eakpoint" comman
33120 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20  d causes a call 
33130 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a  to the no-op.  *
33140 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20  * routine named 
33150 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
33160 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d  )..  */.  if( c=
33170 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
33180 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33190 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  , "breakpoint", 
331a0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73  n)==0 ){.    tes
331b0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  t_breakpoint();.
331c0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
331d0 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
331e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
331f0 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29  ], "changes", n)
33200 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
33210 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
33220 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70  setOrClearFlag(p
33230 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  , SHFLG_CountCha
33240 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  nges, azArg[1]);
33250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33260 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33270 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68  err, "Usage: .ch
33280 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  anges on|off\n")
33290 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
332a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
332b0 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75   /* Cancel outpu
332c0 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69  t redirection, i
332d0 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
332e0 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63  y set (by .testc
332f0 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72  ase).  ** Then r
33300 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
33310 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d  of the testcase-
33320 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64  out.txt file and
33330 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
33340 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20  .  ** azArg[1]. 
33350 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
33360 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72  fferences, repor
33370 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65  t an error and e
33380 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xit..  */.  if( 
33390 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
333a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
333b0 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d  0], "check", n)=
333c0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
333d0 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75  zRes = 0;.    ou
333e0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
333f0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
33400 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
33410 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
33420 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50  e: .check GLOB-P
33430 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20  ATTERN\n");.    
33440 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
33450 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20  lse if( (zRes = 
33460 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61  readFile("testca
33470 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29  se-out.txt", 0))
33480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
33490 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
334a0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72  "Error: cannot r
334b0 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75  ead 'testcase-ou
334c0 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
334d0 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
334e0 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65  lse if( testcase
334f0 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a  _glob(azArg[1],z
33500 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Res)==0 ){.     
33510 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33520 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
33530 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d        "testcase-
33540 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65  %s FAILED\n Expe
33550 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20  cted: [%s]\n    
33560 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a    Got: [%s]\n",.
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61   p->zTestcase, a
33590 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a  zArg[1], zRes);.
335a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
335b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
335c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
335d0 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20  t, "testcase-%s 
335e0 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63  ok\n", p->zTestc
335f0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ase);.      p->n
33600 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Check++;.    }. 
33610 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
33620 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zRes);.  }else..
33630 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
33640 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33650 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30  , "clone", n)==0
33660 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
33670 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79  ==2 ){.      try
33680 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67  ToClone(p, azArg
33690 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
336a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
336b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
336c0 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d  : .clone FILENAM
336d0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
336e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
336f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
33700 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63   && n>1 && strnc
33710 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61  mp(azArg[0], "da
33720 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20  tabases", n)==0 
33730 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  ){.    ShellStat
33740 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
33750 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
33760 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
33770 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
33780 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
33790 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
337a0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
337b0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
337c0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
337d0 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  _List;.    sqlit
337e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
337f0 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72  of(data.colSepar
33800 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65  ator),data.colSe
33810 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20  parator,": ");. 
33820 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b     data.cnt = 0;
33830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
33840 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
33850 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d   name, file FROM
33860 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
33870 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
33880 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
33890 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
338a0 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
338b0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74  rMsg ){.      ut
338c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
338d0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
338e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
338f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
33900 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
33910 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
33920 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
33930 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
33940 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
33950 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20  bconfig", n)==0 
33960 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
33970 6e 73 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e  nst struct DbCon
33980 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20 20  figChoices {.   
33990 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
339a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
339b0 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f 6e  op;.    } aDbCon
339c0 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  fig[] = {.      
339d0 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65 79    { "enable_fkey
339e0 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  ",      SQLITE_D
339f0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
33a00 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20 7d  KEY            }
33a10 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  ,.        { "ena
33a20 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20 20  ble_trigger",   
33a30 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
33a40 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20  ENABLE_TRIGGER  
33a50 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
33a60 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69    { "fts3_tokeni
33a70 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44  zer",   SQLITE_D
33a80 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
33a90 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20 7d  TS3_TOKENIZER  }
33aa0 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f 61  ,.        { "loa
33ab0 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
33ac0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
33ad0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
33ae0 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20 20  NSION  },.      
33af0 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f    { "no_ckpt_on_
33b00 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f 44  close", SQLITE_D
33b10 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
33b20 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 7d  ON_CLOSE       }
33b30 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  ,.        { "ena
33b40 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20 20  ble_qpsg",      
33b50 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
33b60 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20 20  ENABLE_QPSG     
33b70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
33b80 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71 70    { "trigger_eqp
33b90 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  ",      SQLITE_D
33ba0 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
33bb0 45 51 50 20 20 20 20 20 20 20 20 20 20 20 20 7d  EQP            }
33bc0 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65 73  ,.        { "res
33bd0 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20 20  et_database",   
33be0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
33bf0 52 45 53 45 54 5f 44 41 54 41 42 41 53 45 20 20  RESET_DATABASE  
33c00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
33c10 20 20 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c    { "defensive",
33c20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
33c30 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
33c40 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  E              }
33c50 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
33c60 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e   ii, v;.    open
33c70 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66  _db(p, 0);.    f
33c80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61  or(ii=0; ii<Arra
33c90 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
33ca0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
33cb0 66 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72  f( nArg>1 && str
33cc0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44  cmp(azArg[1], aD
33cd0 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
33ce0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
33cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
33d00 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=3 ){.        s
33d10 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
33d20 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69  (p->db, aDbConfi
33d30 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61  g[ii].op, boolea
33d40 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  nValue(azArg[2])
33d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
33d60 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
33d70 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62  onfig(p->db, aDb
33d80 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d  Config[ii].op, -
33d90 31 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74  1, &v);.      ut
33da0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
33db0 2c 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61  , "%18s %s\n", a
33dc0 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61  DbConfig[ii].zNa
33dd0 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22  me, v ? "on" : "
33de0 6f 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28  off");.      if(
33df0 20 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b   nArg>1 ) break;
33e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33e10 41 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72  Arg>1 && ii==Arr
33e20 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67  aySize(aDbConfig
33e30 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
33e40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33e50 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64  Error: unknown d
33e60 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e  bconfig \"%s\"\n
33e70 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
33e80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33e90 73 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c  stderr, "Enter \
33ea0 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74  ".dbconfig\" wit
33eb0 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66  h no arguments f
33ec0 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20  or a list\n");. 
33ed0 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a     }   .  }else.
33ee0 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
33ef0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
33f00 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e  (azArg[0], "dbin
33f10 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  fo", n)==0 ){.  
33f20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69    rc = shell_dbi
33f30 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e  nfo_command(p, n
33f40 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d  Arg, azArg);.  }
33f50 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
33f60 72 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  r' && strncmp(az
33f70 41 72 67 5b 30 5d 2c 20 22 72 65 63 6f 76 65 72  Arg[0], "recover
33f80 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
33f90 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
33fa0 20 20 20 72 63 20 3d 20 72 65 63 6f 76 65 72 44     rc = recoverD
33fb0 61 74 61 62 61 73 65 43 6d 64 28 70 2c 20 6e 41  atabaseCmd(p, nA
33fc0 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
33fd0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
33fe0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
33ff0 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
34000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
34010 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20  t char *zLike = 
34020 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
34030 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48    int savedShowH
34040 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48  eader = p->showH
34050 65 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73  eader;.    int s
34060 61 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d  avedShellFlags =
34070 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20   p->shellFlgs;. 
34080 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
34090 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
340a0 72 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e  rveRowid|SHFLG_N
340b0 65 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63  ewlines|SHFLG_Ec
340c0 68 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ho);.    for(i=1
340d0 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
340e0 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b        if( azArg[
340f0 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
34100 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34110 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31   *z = azArg[i]+1
34120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
34130 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  0]=='-' ) z++;. 
34140 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
34150 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f  p(z,"preserve-ro
34160 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66  wids")==0 ){.#if
34170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34180 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
34190 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
341a0 66 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d  f(stderr, "The -
341b0 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
341c0 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63   option is not c
341d0 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20  ompatible".     
341e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341f0 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53          " with S
34200 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
34210 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  ALTABLE\n");.   
34220 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34230 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
34240 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
34250 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
34260 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
34270 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
34280 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  owid);.#endif.  
34290 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
342a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
342b0 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20  ,"newlines")==0 
342c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  ){.          She
342d0 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
342e0 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20  LG_Newlines);.  
342f0 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
34300 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
34310 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
34320 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
34330 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e  on \"%s\" on \".
34340 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  dump\"\n", azArg
34350 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
34360 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
34370 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
34380 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
34390 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
343a0 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20  if( zLike ){.   
343b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
343c0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
343d0 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76  .dump ?--preserv
343e0 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20  e-rowids? ".    
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69         "?--newli
34410 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  nes? ?LIKE-PATTE
34420 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
34430 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
34440 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34450 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
34460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c  else{.        zL
34470 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a  ike = azArg[i];.
34480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
34490 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
344a0 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
344b0 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64  laying back a "d
344c0 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ump", the conten
344d0 74 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  t might appear i
344e0 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  n an order.    *
344f0 2a 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69  * which causes i
34500 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
34510 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
34520 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e   to be violated.
34530 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62  .    ** So disab
34540 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63  le foreign-key c
34550 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63  onstraint enforc
34560 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74  ement to prevent
34570 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20   problems. */.  
34580 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
34590 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  out, "PRAGMA for
345a0 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e  eign_keys=OFF;\n
345b0 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
345c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
345d0 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
345e0 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
345f0 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
34600 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
34610 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74   = 0;.    /* Set
34620 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
34630 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  =ON since doing 
34640 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65  so forces SQLite
34650 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
34660 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66     ** as much of
34670 20 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69   the schema as i
34680 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68  t can even if th
34690 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
346a0 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20  table is.    ** 
346b0 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
346c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
346d0 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64  db, "SAVEPOINT d
346e0 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74  ump; PRAGMA writ
346f0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c  able_schema=ON",
34700 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
34710 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  ->nErr = 0;.    
34720 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a  if( zLike==0 ){.
34730 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
34740 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
34750 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
34760 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
34770 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
34780 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ter ".          
34790 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e  "WHERE sql NOT N
347a0 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  ULL AND type=='t
347b0 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d  able' AND name!=
347c0 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
347d0 27 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  '".          );.
347e0 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
347f0 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
34800 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
34810 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
34820 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
34830 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ter ".          
34840 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
34850 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
34860 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
34870 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
34880 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
34890 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
348a0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
348b0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ter ".          
348c0 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e  "WHERE sql NOT N
348d0 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20  ULL AND type IN 
348e0 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
348f0 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20  r','view')", 0. 
34900 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
34910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
34920 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
34930 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
34940 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
34950 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
34960 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
34970 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
34980 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
34990 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20  bl_name LIKE %Q 
349a0 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
349b0 27 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  '".          "  
349c0 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  AND sql NOT NULL
349d0 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20  ", zLike);.     
349e0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
349f0 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a  _query(p,zSql);.
34a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
34a10 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
34a20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
34a30 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
34a40 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
34a50 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
34a60 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48   ".          "WH
34a70 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
34a80 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41  ".          "  A
34a90 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
34aa0 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
34ab0 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20  iew')".         
34ac0 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65   "  AND tbl_name
34ad0 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65   LIKE %Q", zLike
34ae0 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
34af0 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
34b00 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zSql, 0);.     
34b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
34b20 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
34b30 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  f( p->writableSc
34b40 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61  hema ){.      ra
34b50 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
34b60 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
34b70 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
34b80 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
34b90 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
34ba0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
34bb0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
34bc0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
34bd0 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
34be0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
34bf0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
34c00 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20  RELEASE dump;", 
34c10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 61  0, 0, 0);.    ra
34c20 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
34c30 20 70 2d 3e 6e 45 72 72 3f 22 52 4f 4c 4c 42 41   p->nErr?"ROLLBA
34c40 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72  CK; -- due to er
34c50 72 6f 72 73 5c 6e 22 3a 22 43 4f 4d 4d 49 54 3b  rors\n":"COMMIT;
34c60 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f  \n");.    p->sho
34c70 77 48 65 61 64 65 72 20 3d 20 73 61 76 65 64 53  wHeader = savedS
34c80 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 70  howHeader;.    p
34c90 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61  ->shellFlgs = sa
34ca0 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20  vedShellFlags;. 
34cb0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34cc0 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
34cd0 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22  azArg[0], "echo"
34ce0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
34cf0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
34d00 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
34d10 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
34d20 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
34d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
34d40 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34d50 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f   "Usage: .echo o
34d60 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
34d70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
34d80 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34d90 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
34da0 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c  azArg[0], "eqp",
34db0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
34dc0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
34dd0 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73     p->autoEQPtes
34de0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
34df0 20 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65   p->autoEQPtrace
34e00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
34e10 70 2d 3e 64 62 20 29 20 73 71 6c 69 74 65 33 5f  p->db ) sqlite3_
34e20 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
34e30 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d 4f  GMA vdbe_trace=O
34e40 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
34e50 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
34e60 51 50 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  QPtrace = 0;.   
34e70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
34e80 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
34e90 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  full")==0 ){.   
34ea0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
34eb0 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a  = AUTOEQP_full;.
34ec0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34ed0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
34ee0 22 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b  "trigger")==0 ){
34ef0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
34f00 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72  EQP = AUTOEQP_tr
34f10 69 67 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51  igger;.#ifdef SQ
34f20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
34f30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
34f40 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74  p(azArg[1],"test
34f50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
34f60 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
34f70 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20  TOEQP_on;.      
34f80 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74    p->autoEQPtest
34f90 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
34fa0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
34fb0 72 67 5b 31 5d 2c 22 74 72 61 63 65 22 29 3d 3d  rg[1],"trace")==
34fc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
34fd0 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
34fe0 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_full;.        
34ff0 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20  p->autoEQPtrace 
35000 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  = 1;.        ope
35010 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
35020 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
35030 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
35040 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
35050 5f 6d 61 73 74 65 72 20 4c 49 4d 49 54 20 31 22  _master LIMIT 1"
35060 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
35070 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
35080 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
35090 76 64 62 65 5f 74 72 61 63 65 3d 4f 4e 3b 22 2c  vdbe_trace=ON;",
350a0 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
350b0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
350c0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
350d0 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56  P = (u8)booleanV
350e0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
350f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35100 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
35110 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35120 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c  ge: .eqp off|on|
35130 74 72 61 63 65 7c 74 72 69 67 67 65 72 7c 66 75  trace|trigger|fu
35140 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ll\n");.      rc
35150 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
35160 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
35170 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
35180 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e  rg[0], "exit", n
35190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
351a0 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20  nArg>1 && (rc = 
351b0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
351c0 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20  e(azArg[1]))!=0 
351d0 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20  ) exit(rc);.    
351e0 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
351f0 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c  .  /* The ".expl
35200 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ain" command is 
35210 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20  automatic now.  
35220 49 74 20 69 73 20 6c 61 72 67 65 6c 79 20 70 6f  It is largely po
35230 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a  intless.  It.  *
35240 2a 20 72 65 74 61 69 6e 65 64 20 70 75 72 65 6c  * retained purel
35250 79 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20  y for backwards 
35260 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f  compatibility */
35270 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
35280 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
35290 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29  ], "explain", n)
352a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  ==0 ){.    int v
352b0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
352c0 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20  nArg>=2 ){.     
352d0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
352e0 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20  g[1],"auto")==0 
352f0 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d  ){.        val =
35300 20 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   99;.      }else
35310 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20  {.        val = 
35320 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
35330 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
35340 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76  .    }.    if( v
35350 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65  al==1 && p->mode
35360 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  !=MODE_Explain )
35370 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61  {.      p->norma
35380 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  lMode = p->mode;
35390 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
353a0 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20   MODE_Explain;. 
353b0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c       p->autoExpl
353c0 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ain = 0;.    }el
353d0 73 65 20 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b  se if( val==0 ){
353e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f  .      if( p->mo
353f0 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
35400 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e   ) p->mode = p->
35410 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20  normalMode;.    
35420 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
35430 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
35440 69 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20  if( val==99 ){. 
35450 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65       if( p->mode
35460 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
35470 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f   p->mode = p->no
35480 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20  rmalMode;.      
35490 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d  p->autoExplain =
354a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
354b0 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
354c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
354d0 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  BLE.  if( c=='e'
354e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
354f0 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22 2c 20  g[0], "expert", 
35500 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  n)==0 ){.    ope
35510 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
35520 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64  expertDotCommand
35530 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  (p, azArg, nArg)
35540 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
35550 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26  ..  if( c=='f' &
35560 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35570 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22  0], "fullschema"
35580 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
35590 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a  hellState data;.
355a0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
355b0 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64  g = 0;.    int d
355c0 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20  oStats = 0;.    
355d0 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
355e0 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
355f0 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
35600 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
35610 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
35620 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b  ode = MODE_Semi;
35630 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
35640 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28   && optionMatch(
35650 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e  azArg[1], "inden
35660 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74  t") ){.      dat
35670 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
35680 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74  ode = MODE_Prett
35690 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  y;.      nArg = 
356a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
356b0 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20   nArg!=1 ){.    
356c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
356d0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75  err, "Usage: .fu
356e0 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65  llschema ?--inde
356f0 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  nt?\n");.      r
35700 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
35710 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35720 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
35730 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
35740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
35750 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
35760 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
35770 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53  OM".       "  (S
35780 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74  ELECT sql sql, t
35790 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ype type, tbl_na
357a0 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  me tbl_name, nam
357b0 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22  e name, rowid x"
357c0 0a 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52  .       "     FR
357d0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
357e0 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20   UNION ALL".    
357f0 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71     "   SELECT sq
35800 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
35810 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46  e, name, rowid F
35820 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
35830 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20  master) ".      
35840 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d   "WHERE type!='m
35850 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54  eta' AND sql NOT
35860 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f  NULL AND name NO
35870 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25  T LIKE 'sqlite_%
35880 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45  ' ".       "ORDE
35890 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20  R BY rowid",.   
358a0 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
358b0 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20  ata, &zErrMsg.  
358c0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
358d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
358e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
358f0 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72   *pStmt;.      r
35900 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
35910 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20  are_v2(p->db,.  
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
35930 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
35940 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
35950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
35960 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20  WHERE name GLOB 
35970 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34  'sqlite_stat[134
35980 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ]'",.           
35990 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
359a0 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74  0);.      doStat
359b0 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  s = sqlite3_step
359c0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
359d0 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROW;.      sqlit
359e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
359f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
35a00 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a  ( doStats==0 ){.
35a10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35a20 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20  (p->out, "/* No 
35a30 53 54 41 54 20 74 61 62 6c 65 73 20 61 76 61 69  STAT tables avai
35a40 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20  lable */\n");.  
35a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
35a60 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
35a70 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
35a80 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
35a90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
35aa0 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
35ab0 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   'ANALYZE sqlite
35ac0 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20  _master'",.     
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
35ae0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
35af0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
35b00 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74  data.cMode = dat
35b10 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e  a.mode = MODE_In
35b20 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61  sert;.      data
35b30 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73  .zDestTable = "s
35b40 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20  qlite_stat1";.  
35b50 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26      shell_exec(&
35b60 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20  data, "SELECT * 
35b70 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
35b80 31 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  1", &zErrMsg);. 
35b90 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
35ba0 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
35bb0 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65  tat3";.      she
35bc0 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22  ll_exec(&data, "
35bd0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
35be0 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 26 7a 45  lite_stat3", &zE
35bf0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
35c00 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
35c10 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a  "sqlite_stat4";.
35c20 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
35c30 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
35c40 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
35c50 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at4", &zErrMsg);
35c60 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
35c70 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
35c80 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
35c90 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ;\n");.    }.  }
35ca0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
35cb0 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
35cc0 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73  Arg[0], "headers
35cd0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
35ce0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
35cf0 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64       p->showHead
35d00 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
35d10 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
35d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
35d30 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35d40 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65 72   "Usage: .header
35d50 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
35d60 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35d70 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
35d80 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
35d90 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
35da0 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  lp", n)==0 ){.  
35db0 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b    if( nArg>=2 ){
35dc0 0a 20 20 20 20 20 20 6e 20 3d 20 73 68 6f 77 48  .      n = showH
35dd0 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  elp(p->out, azAr
35de0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  g[1]);.      if(
35df0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
35e00 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
35e10 6f 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20 6d 61  out, "Nothing ma
35e20 74 63 68 65 73 20 27 25 73 27 5c 6e 22 2c 20 61  tches '%s'\n", a
35e30 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
35e40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
35e50 20 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f     showHelp(p->o
35e60 75 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ut, 0);.    }.  
35e70 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
35e80 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
35e90 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74  zArg[0], "import
35ea0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
35eb0 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
35ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35ed0 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
35ee0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
35ef0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
35f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f10 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
35f20 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66   extra content f
35f30 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  rom */.    sqlit
35f40 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
35f50 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74   NULL; /* A stat
35f60 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
35f70 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
35f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
35f90 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
35fa0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
35fb0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
35fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35fd0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
35fe0 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
35ff0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
36000 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
36010 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
36020 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
36030 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20   needCommit;    
36040 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
36050 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f   to COMMIT or RO
36060 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f  LLBACK at end */
36070 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
360a0 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70  tes in p->colSep
360b0 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
360c0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
360d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
360e0 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
360f0 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78  */.    ImportCtx
36100 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20   sCtx;          
36110 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e     /* Reader con
36120 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  text */.    char
36130 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20   *(SQLITE_CDECL 
36140 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74  *xRead)(ImportCt
36150 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20  x*); /* Func to 
36160 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a  read one value *
36170 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54  /.    int (SQLIT
36180 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72  E_CDECL *xCloser
36190 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f  )(FILE*);      /
361a0 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20  * Func to close 
361b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  file */..    if(
361c0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
361d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
361e0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d  err, "Usage: .im
361f0 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c  port FILE TABLE\
36200 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  n");.      goto 
36210 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36220 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  t;.    }.    zFi
36230 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
36240 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72     zTable = azAr
36250 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e  g[2];.    seenIn
36260 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  terrupt = 0;.   
36270 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30   memset(&sCtx, 0
36280 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b  , sizeof(sCtx));
36290 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
362a0 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
362b0 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65  trlen30(p->colSe
362c0 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66  parator);.    if
362d0 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
362e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
362f0 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
36300 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e         "Error: n
36310 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73  on-null column s
36320 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
36330 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
36340 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
36350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36360 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
36370 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36380 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
36390 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d  -character colum
363a0 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  n separators not
363b0 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
363c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363d0 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
363e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
363f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70  ;.    }.    nSep
36400 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
36410 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
36420 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
36430 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36440 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
36450 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73  : non-null row s
36460 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
36470 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
36480 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
36490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
364a0 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f  nSep==2 && p->mo
364b0 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20  de==MODE_Csv && 
364c0 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70  strcmp(p->rowSep
364d0 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
364e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
364f0 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20   When importing 
36500 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74  CSV (only), if t
36510 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
36520 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
36530 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20       ** default 
36540 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
36550 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20  ator, change it 
36560 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 69  to the default i
36570 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  nput.      ** ro
36580 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
36590 69 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67  is avoids having
365a0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66   to maintain dif
365b0 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20  ferent input.   
365c0 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74     ** and output
365d0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e   row separators.
365e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
365f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36600 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
36610 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
36620 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
36630 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c       nSep = strl
36640 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
36650 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ator);.    }.   
36660 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20   if( nSep>1 ){. 
36670 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36680 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
36690 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20  multi-character 
366a0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e  row separators n
366b0 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
366c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366d0 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
366e0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
366f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
36700 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65  tx.zFile = zFile
36710 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65  ;.    sCtx.nLine
36720 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43   = 1;.    if( sC
36730 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  tx.zFile[0]=='|'
36740 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
36750 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
36760 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36770 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
36780 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
36790 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
367a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
367b0 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 1;.#else.    
367c0 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65    sCtx.in = pope
367d0 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20  n(sCtx.zFile+1, 
367e0 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78  "r");.      sCtx
367f0 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e  .zFile = "<pipe>
36800 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ";.      xCloser
36810 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69   = pclose;.#endi
36820 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
36830 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70     sCtx.in = fop
36840 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22  en(sCtx.zFile, "
36850 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  rb");.      xClo
36860 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20  ser = fclose;.  
36870 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d    }.    if( p->m
36880 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20  ode==MODE_Ascii 
36890 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d  ){.      xRead =
368a0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
368b0 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65  field;.    }else
368c0 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20  {.      xRead = 
368d0 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
368e0 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ld;.    }.    if
368f0 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a  ( sCtx.in==0 ){.
36900 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36910 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
36920 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
36930 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
36940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
36950 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e  .    }.    sCtx.
36960 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c  cColSep = p->col
36970 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
36980 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d    sCtx.cRowSep =
36990 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
369a0 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  [0];.    zSql = 
369b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
369c0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
369d0 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
369e0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
369f0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
36a00 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68  tx.in);.      sh
36a10 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
36a20 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  y();.    }.    n
36a30 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Byte = strlen30(
36a40 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
36a50 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
36a60 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
36a70 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
36a80 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
36a90 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29  d_char(&sCtx, 0)
36aa0 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72  ;    /* To ensur
36ab0 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f  e sCtx.z is allo
36ac0 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
36ad0 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73   rc && sqlite3_s
36ae0 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20  trglob("no such 
36af0 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74  table: *", sqlit
36b00 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
36b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
36b20 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
36b30 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
36b40 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
36b50 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
36b60 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
36b70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52  .      while( xR
36b80 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20  ead(&sCtx) ){.  
36b90 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
36ba0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
36bb0 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20  "%z%c\n  \"%w\" 
36bc0 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20  TEXT", zCreate, 
36bd0 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20  cSep, sCtx.z);. 
36be0 20 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c         cSep = ',
36bf0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ';.        if( s
36c00 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
36c10 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b  cColSep ) break;
36c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36c30 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
36c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36c50 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
36c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
36c70 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
36c80 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
36c90 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75  x.in);.        u
36ca0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
36cb0 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c  r,"%s: empty fil
36cc0 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  e\n", sCtx.zFile
36cd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
36ce0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
36cf0 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
36d00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
36d10 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a  \n)", zCreate);.
36d20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36d30 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
36d40 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
36d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36d60 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
36d70 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36d80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
36d90 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41  tf(stderr, "CREA
36da0 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29  TE TABLE %s(...)
36db0 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
36dc0 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20  zTable,.        
36dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36de0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
36df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36e00 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
36e10 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
36e20 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  tx.in);.        
36e30 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
36e40 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
36e50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
36e60 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
36e70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
36e80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
36e90 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
36ea0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
36eb0 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
36ec0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
36ed0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
36ee0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
36ef0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
36f00 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
36f10 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
36f20 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
36f30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
36f40 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  .    nCol = sqli
36f50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
36f60 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
36f70 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
36f80 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
36f90 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  = 0;.    if( nCo
36fa0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
36fb0 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20   /* no columns, 
36fc0 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  no error */.    
36fd0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
36fe0 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32  alloc64( nByte*2
36ff0 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
37000 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
37010 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73  0 ){.      xClos
37020 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
37030 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f     shell_out_of_
37040 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
37050 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37060 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a  intf(nByte+20, z
37070 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54  Sql, "INSERT INT
37080 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28  O \"%w\" VALUES(
37090 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
370a0 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
370b0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
370c0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
370d0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
370e0 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
370f0 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
37100 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
37110 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
37120 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
37130 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
37140 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
37150 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
37160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
37170 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
37180 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
37190 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
371a0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
371b0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
371c0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
371d0 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
371e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
371f0 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  t);.      xClose
37200 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
37210 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
37220 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74  }.    needCommit
37230 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61   = sqlite3_get_a
37240 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29  utocommit(p->db)
37250 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f  ;.    if( needCo
37260 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65  mmit ) sqlite3_e
37270 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49  xec(p->db, "BEGI
37280 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
37290 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20    do{.      int 
372a0 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78  startLine = sCtx
372b0 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f  .nLine;.      fo
372c0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
372d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
372e0 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43  r *z = xRead(&sC
372f0 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  tx);.        /*.
37300 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
37310 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
37320 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69  ile before findi
37330 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a  ng any columns?.
37340 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f          ** If so
37350 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f  , stop instead o
37360 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74  f NULL filling t
37370 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
37380 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
37390 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
373a0 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61  0 && i==0 ) brea
373b0 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  k;.        /*.  
373c0 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20        ** Did we 
373d0 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
373e0 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  e OR end-of-line
373f0 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20   before finding 
37400 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  any.        ** c
37410 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20  olumns in ASCII 
37420 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74  mode?  If so, st
37430 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  op instead of NU
37440 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  LL filling.     
37450 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e     ** the remain
37460 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
37470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37480 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
37490 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30  E_Ascii && (z==0
374a0 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20   || z[0]==0) && 
374b0 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
374c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
374d0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
374e0 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  +1, z, -1, SQLIT
374f0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
37500 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
37510 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d  -1 && sCtx.cTerm
37520 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
37530 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
37540 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
37550 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
37560 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
37570 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
37580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37590 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20         "filling 
375a0 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55  the rest with NU
375b0 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375d0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
375e0 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b  rtLine, nCol, i+
375f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
37600 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
37610 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29  while( i<=nCol )
37620 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  { sqlite3_bind_n
37630 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69  ull(pStmt, i); i
37640 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++; }.        }.
37650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37660 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43  ( sCtx.cTerm==sC
37670 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20  tx.cColSep ){.  
37680 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
37690 20 20 20 20 78 52 65 61 64 28 26 73 43 74 78 29      xRead(&sCtx)
376a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
376b0 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28  .        }while(
376c0 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74   sCtx.cTerm==sCt
376d0 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20  x.cColSep );.   
376e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
376f0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
37700 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
37710 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
37720 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
37740 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22  xtras ignored\n"
37750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37760 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
37770 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
37780 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20   nCol, i);.     
37790 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
377a0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
377b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
377c0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
377d0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
377e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
377f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37800 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
37810 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
37820 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52  r, "%s:%d: INSER
37830 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  T failed: %s\n",
37840 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20   sCtx.zFile,.   
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71     startLine, sq
37870 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
37880 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
37890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
378a0 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  le( sCtx.cTerm!=
378b0 45 4f 46 2