/ Hex Artifact Content
Login

Artifact 21e30c2cf16aa873c9ce2cd6ca1c8933c830e69b73c1e74f4fdffbda80e9c356:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6300: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6310: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
6330: 41 47 45 5f 56 54 41 42 29 0a 49 4e 43 4c 55 44  AGE_VTAB).INCLUD
6340: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 64 62  E ../ext/misc/db
6350: 64 61 74 61 2e 63 0a 23 65 6e 64 69 66 0a 0a 23  data.c.#endif..#
6360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6370: 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
6380: 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  )./*.** State in
6390: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
63a0: 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73  single open sess
63b0: 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ion.*/.typedef s
63c0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63d0: 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73  n OpenSession;.s
63e0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63f0: 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  n {.  char *zNam
6400: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
6410: 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  * Symbolic name 
6420: 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e  for this session
6430: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65   */.  int nFilte
6440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
6450: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c  * Number of xFil
6460: 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c  ter rejection GL
6470: 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20  OB patterns */. 
6480: 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72   char **azFilter
6490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ;         /* Arr
64a0: 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  ay of xFilter re
64b0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
64c0: 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74  terns */.  sqlit
64d0: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20  e3_session *p;  
64e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
64f0: 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65  session */.};.#e
6500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c  ndif../*.** Shel
6510: 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e  l output mode in
6520: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
6530: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
6540: 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f  on",.** saved so
6550: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
6560: 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78  restored by ".ex
6570: 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79  plain off".*/.ty
6580: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76  pedef struct Sav
6590: 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64  edModeInfo Saved
65a0: 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ModeInfo;.struct
65b0: 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b   SavedModeInfo {
65c0: 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20  .  int valid;   
65d0: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65         /* Is the
65e0: 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e  re legit data in
65f0: 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   here? */.  int 
6600: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
6610: 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f  /* Mode prior to
6620: 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a   ".explain on" *
6630: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
6640: 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22  er;     /* The "
6650: 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67  .header" setting
6660: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6670: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6680: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
6690: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68   /* Column width
66a0: 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  s prior to ".exp
66b0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a  lain on" */.};..
66c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
66d0: 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74  xpertInfo Expert
66e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70  Info;.struct Exp
66f0: 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69  ertInfo {.  sqli
6700: 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65  te3expert *pExpe
6710: 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f  rt;.  int bVerbo
6720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e  se;.};../* A sin
6730: 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20  gle line in the 
6740: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79  EQP output */.ty
6750: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6760: 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61 70  GraphRow EQPGrap
6770: 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50  hRow;.struct EQP
6780: 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74  GraphRow {.  int
6790: 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20 20   iEqpId;        
67a0: 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69     /* ID for thi
67b0: 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  s row */.  int i
67c0: 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20  ParentId;       
67d0: 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61   /* ID of the pa
67e0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51  rent row */.  EQ
67f0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74  PGraphRow *pNext
6800: 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20  ;   /* Next row 
6810: 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  in sequence */. 
6820: 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20   char zText[1]; 
6830: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
6840: 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68  o display for th
6850: 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  is row */.};../*
6860: 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20   All EQP output 
6870: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
6880: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
68a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
68b0: 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72 61   EQPGraph EQPGra
68c0: 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ph;.struct EQPGr
68d0: 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68  aph {.  EQPGraph
68e0: 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a  Row *pRow;    /*
68f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
6900: 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
6910: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
6920: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61  EQPGraphRow *pLa
6930: 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c  st;   /* Last el
6940: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f  ement of the pRo
6950: 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  w list */.  char
6960: 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20   zPrefix[100];  
6970: 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69    /* Graph prefi
6980: 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  x */.};../*.** S
6990: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
69a0: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
69b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
69c0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
69d0: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
69e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
6a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
6a10: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
6a20: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
6a30: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
6a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
6a50: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
6a60: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c  */.  u8 autoExpl
6a70: 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ain;        /* A
6a80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
6a90: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
6aa0: 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45  de */.  u8 autoE
6ab0: 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  QP;            /
6ac0: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
6ad0: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
6ae0: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
6af0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6b00: 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  test;        /* 
6b10: 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65  autoEQP is in te
6b20: 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20  st mode */.  u8 
6b30: 61 75 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20  autoEQPtrace;   
6b40: 20 20 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69      /* autoEQP i
6b50: 73 20 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20  s in trace mode 
6b60: 2a 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b  */.  u8 statsOn;
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6b80: 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d  rue to display m
6b90: 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f  emory stats befo
6ba0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
6bb0: 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61   */.  u8 scansta
6bc0: 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  tsOn;        /* 
6bd0: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
6be0: 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72  scan stats befor
6bf0: 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20  e each finalize 
6c00: 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65  */.  u8 openMode
6c10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
6c20: 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
6c30: 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72  , _APPENDVFS, or
6c40: 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75   _ZIPFILE */.  u
6c50: 38 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20  8 doXdgOpen;    
6c60: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
6c70: 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
6c80: 70 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65  pen in output_re
6c90: 73 65 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45  set() */.  u8 nE
6ca0: 71 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  qpLevel;        
6cb0: 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68    /* Depth of th
6cc0: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6cd0: 70 68 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63  ph */.  u8 eTrac
6ce0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  eType;         /
6cf0: 2a 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20  * SHELL_TRACE_* 
6d00: 76 61 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f  value for type o
6d10: 66 20 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73  f trace */.  uns
6d20: 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b  igned mEqpLines;
6d30: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
6d40: 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69  eritical lines i
6d50: 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75 74  n the EQP output
6d60: 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20   graph */.  int 
6d70: 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  outCount;       
6d80: 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20     /* Revert to 
6d90: 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63  stdout when reac
6da0: 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69  hing zero */.  i
6db0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
6dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6dd0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
6de0: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
6df0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20   int lineno;    
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c  number of last l
6e20: 69 6e 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e  ine read from in
6e30: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e50: 52 65 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72  Read commands fr
6e60: 6f 6d 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a  om this stream *
6e70: 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20  /.  FILE *out;  
6e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6e90: 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
6ea0: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63   */.  FILE *trac
6eb0: 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  eOut;        /* 
6ec0: 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74  Output for sqlit
6ed0: 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20  e3_trace() */.  
6ee0: 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
6ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f00: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
6f10: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6f30: 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65  n output mode se
6f40: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d  tting */.  int m
6f50: 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20  odePrior;       
6f60: 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20    /* Saved mode 
6f70: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f90: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6fa0: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fb0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fc0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fd0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fe0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6ff0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
7000: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7010: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7020: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7030: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7040: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7050: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7060: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7070: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7080: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7090: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
70a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70b0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70c0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70d0: 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65  unsigned nProgre
70e0: 73 73 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ss;    /* Number
70f0: 20 6f 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c   of progress cal
7100: 6c 62 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72  lbacks encounter
7110: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
7120: 20 6d 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f   mxProgress;   /
7130: 2a 20 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65  * Maximum progre
7140: 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66  ss callbacks bef
7150: 6f 72 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20  ore failing */. 
7160: 20 75 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f   unsigned flgPro
7170: 67 72 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73  gress;  /* Flags
7180: 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73   for the progres
7190: 73 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  s callback */.  
71a0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
71b0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
71c0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  s flags */.  sql
71d0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78  ite3_int64 szMax
71e0: 3b 20 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65  ;   /* --maxsize
71f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70   argument to .op
7200: 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  en */.  char *zD
7210: 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f  estTable;      /
7220: 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e  * Name of destin
7230: 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e  ation table when
7240: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a   MODE_Insert */.
7250: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
7260: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  e;       /* Temp
7270: 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20  orary file that 
7280: 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74  might need delet
7290: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
72a0: 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20  estcase[30];    
72b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65  /* Name of curre
72c0: 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a  nt test case */.
72d0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61    char colSepara
72e0: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75  tor[20]; /* Colu
72f0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
7300: 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72  racter for sever
7310: 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68  al modes */.  ch
7320: 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  ar rowSeparator[
7330: 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61  20]; /* Row sepa
7340: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
7350: 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a  for MODE_Ascii *
7360: 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50  /.  char colSepP
7370: 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61  rior[20];  /* Sa
7380: 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ved column separ
7390: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72  ator */.  char r
73a0: 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  owSepPrior[20]; 
73b0: 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65   /* Saved row se
73c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
73d0: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
73e0: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
73f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
7400: 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f  olumn when in co
7410: 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e  lumn mode*/.  in
7420: 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30  t actualWidth[10
7430: 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77  0];  /* Actual w
7440: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7450: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75  umn */.  char nu
7460: 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20  llValue[20];    
7470: 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70  /* The text to p
7480: 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c  rint when a NULL
7490: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
74a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
74c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
74d0: 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45  har outfile[FILE
74e0: 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69  NAME_MAX]; /* Fi
74f0: 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20  lename for *out 
7500: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7510: 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20  *zDbFilename;   
7520: 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
7530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7540: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e  .  char *zFreeOn
7550: 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Close;         /
7560: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72  * Filename to fr
7570: 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ee when closing 
7580: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7590: 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *zVfs;          
75a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
75b0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
75c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
75d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
75e0: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20  atement if any. 
75f0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b  */.  FILE *pLog;
7600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
7610: 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20  rite log output 
7620: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  here */.  int *a
7630: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
7640: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
7650: 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44  ents used in MOD
7660: 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69  E_Explain */.  i
7670: 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt nIndent;     
7680: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7690: 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b   array aiIndent[
76a0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  ] */.  int iInde
76b0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
76c0: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
76d0: 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74  t op in aiIndent
76e0: 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68  [] */.  EQPGraph
76f0: 20 73 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f   sGraph;       /
7700: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * Information fo
7710: 72 20 74 68 65 20 67 72 61 70 68 69 63 61 6c 20  r the graphical 
7720: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7730: 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  AN */.#if define
7740: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
7750: 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e  SESSION).  int n
7760: 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Session;        
7770: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7780: 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e  f active session
7790: 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69  s */.  OpenSessi
77a0: 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20  on aSession[4]; 
77b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73   /* Array of ses
77c0: 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69  sions.  [0] is i
77d0: 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64  n focus. */.#end
77e0: 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20  if.  ExpertInfo 
77f0: 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f  expert;        /
7800: 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69  * Valid if previ
7810: 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  ous command was 
7820: 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22  ".expert OPT..."
7830: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f   */.};.../* Allo
7840: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53  wed values for S
7850: 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51  hellState.autoEQ
7860: 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  P.*/.#define AUT
7870: 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20  OEQP_off      0 
7880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74            /* Aut
7890: 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
78a0: 55 45 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66  UERY PLAN is off
78b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f   */.#define AUTO
78c0: 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20  EQP_on       1  
78d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f           /* Auto
78e0: 6d 61 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20  matic EQP is on 
78f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7900: 51 50 5f 74 72 69 67 67 65 72 20 20 32 20 20 20  QP_trigger  2   
7910: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e          /* On an
7920: 64 20 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e  d also show plan
7930: 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a  s for triggers *
7940: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7950: 50 5f 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20  P_full     3    
7960: 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66         /* Show f
7970: 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  ull EXPLAIN */..
7980: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7990: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
79a0: 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65  .openMode.*/.#de
79b0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79c0: 55 4e 53 50 45 43 20 20 20 20 20 20 30 20 20 20  UNSPEC      0   
79d0: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
79e0: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
79f0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7a00: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31  EN_NORMAL      1
7a10: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
7a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7a30: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a40: 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20  PEN_APPENDVFS   
7a50: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7a60: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
7a70: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
7a80: 50 46 49 4c 45 20 20 20 20 20 33 20 20 20 20 20  PFILE     3     
7a90: 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66   /* Use the zipf
7aa0: 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
7ab0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7ac0: 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
7ad0: 20 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70      4      /* Op
7ae0: 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61  en a normal data
7af0: 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  base read-only *
7b00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7b10: 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
7b20: 20 35 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   5      /* Open 
7b30: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  using sqlite3_de
7b40: 73 65 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23  serialize() */.#
7b50: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7b60: 4e 5f 48 45 58 44 42 20 20 20 20 20 20 20 36 20  N_HEXDB       6 
7b70: 20 20 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74       /* Use "dbt
7b80: 6f 74 78 74 22 20 6f 75 74 70 75 74 20 61 73 20  otxt" output as 
7b90: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a  data source */..
7ba0: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7bb0: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7bc0: 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23  .eTraceType.*/.#
7bd0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7be0: 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20  CE_PLAIN      0 
7bf0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70       /* Show inp
7c00: 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23  ut SQL text */.#
7c10: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7c20: 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20  CE_EXPANDED   1 
7c30: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70       /* Show exp
7c40: 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a  anded SQL text *
7c50: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7c60: 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
7c70: 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20   2      /* Show 
7c80: 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74  normalized SQL t
7c90: 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20  ext */../* Bits 
7ca0: 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  in the ShellStat
7cb0: 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61  e.flgProgress va
7cc0: 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  riable */.#defin
7cd0: 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  e SHELL_PROGRESS
7ce0: 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20  _QUIET 0x01  /* 
7cf0: 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20  Omit announcing 
7d00: 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20 63  every progress c
7d10: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69  allback */.#defi
7d20: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7d30: 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a  S_RESET 0x02  /*
7d40: 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
7d50: 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65   when the progre
7d60: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
7d90: 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65   limit is reache
7da0: 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  d, and for each.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7de0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
7df0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50  .#define SHELL_P
7e00: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78  ROGRESS_ONCE  0x
7e10: 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68  04  /* Cancel th
7e20: 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20  e --limit after 
7e30: 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a  firing once */..
7e40: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7e50: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7e60: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7e70: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7e80: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7e90: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7ea0: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7eb0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7ec0: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7ed0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7ee0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ef0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7f00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7f10: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7f20: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7f30: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7f40: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7f50: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7f60: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7f70: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7f80: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7f90: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7fa0: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7fb0: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7fc0: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7fd0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7fe0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7ff0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
8000: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
8010: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
8020: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
8030: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
8040: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
8050: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
8060: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
8070: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
8080: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
8090: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
80a0: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
80b0: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
80c0: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
80d0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
80e0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
80f0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
8100: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
8110: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
8120: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
8130: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
8140: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
8150: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
8160: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
8170: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
8180: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
8190: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
81a0: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
81b0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
81c0: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
81d0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81e0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
81f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8200: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
8210: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
8220: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
8230: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
8240: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
8250: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
8260: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
8270: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
8280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8290: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
82a0: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
82b0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
82c0: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
82d0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
82e0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
82f0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
8300: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
8310: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
8320: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
8330: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
8340: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
8350: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
8360: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
8370: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
8380: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
8390: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
83a0: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
83b0: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
83c0: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
83d0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
83e0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
83f0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
8400: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
8410: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
8420: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8430: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8440: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8450: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8460: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8470: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8480: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8490: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
84a0: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
84b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
84c0: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
84d0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
84e0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
84f0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8500: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8510: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8520: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8530: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8540: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8550: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8560: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8570: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8580: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8590: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
85a0: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
85b0: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
85c0: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
85d0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
85e0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
85f0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
8600: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
8610: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
8620: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8630: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8640: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8650: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8660: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8670: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8680: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8690: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
86a0: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
86b0: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
86c0: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
86d0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
86e0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
86f0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
8700: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
8710: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
8720: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8730: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8740: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8750: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8760: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8780: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8790: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
87a0: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
87b0: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
87c0: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
87d0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
87e0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
87f0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
8800: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
8810: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
8820: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8830: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8840: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8850: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8860: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8870: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8880: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8890: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
88a0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
88b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88c0: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
88d0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
88e0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
88f0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
8900: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
8910: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
8920: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8930: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8940: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8950: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8960: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8970: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8980: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8990: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
89b0: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
89c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
89d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
89e0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
89f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
8a00: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
8a10: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
8a20: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8a30: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8a40: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8a50: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8a60: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8a70: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8a80: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8a90: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8aa0: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8ab0: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8ac0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8ad0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8ae0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8af0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8b00: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8b10: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
8b20: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8b30: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8b40: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8b50: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8b60: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8b70: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8b80: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8b90: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8ba0: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8bb0: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8bd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8be0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8bf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8c10: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
8c20: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8c30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8c40: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8c50: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8c60: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8c70: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8c80: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8c90: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8ca0: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8cc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8cd0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8ce0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8cf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8d00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
8d20: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8d30: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8d40: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d60: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d70: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8d80: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8da0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8db0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8dc0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8dd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8de0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8df0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8e00: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8e10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8e20: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8e30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e40: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8e50: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8e60: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8e70: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8e80: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8e90: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8ea0: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8eb0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8ec0: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8ed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8ee0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ef0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8f00: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8f10: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8f20: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8f30: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f50: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8f60: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8f70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8f80: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8fa0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8fb0: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8fc0: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8fd0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8fe0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8ff0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
9000: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
9010: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
9020: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
9030: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
9040: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
9050: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
9060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9080: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
9090: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
90a0: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
90b0: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
90c0: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
90d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
90e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
90f0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
9100: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
9110: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
9120: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9140: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
9150: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9160: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9170: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
9180: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
9190: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
91a0: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
91b0: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
91c0: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
91d0: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
91e0: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
91f0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
9200: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9210: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
9220: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9230: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9240: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9250: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9260: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9270: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9280: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
9290: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
92a0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
92b0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
92c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92d0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92e0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
92f0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
9300: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9310: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
9320: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9330: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9340: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9350: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9370: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9380: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9390: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
93a0: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
93b0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
93c0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93d0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93e0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
93f0: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
9400: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
9410: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9420: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9430: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9440: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9450: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9460: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9470: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9480: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9490: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
94a0: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
94b0: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
94c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94d0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
94f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9500: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9510: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
9520: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9530: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9540: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
9550: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
9560: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
9570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9580: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9590: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
95a0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
95b0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
95c0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
95d0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
95e0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
95f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9600: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
9610: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
9620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
9640: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
9650: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
9660: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
9670: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9680: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9690: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
96a0: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
96b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
96c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
96d0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
96e0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
96f0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
9700: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
9710: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
9720: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
9730: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
9740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
9750: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
9760: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
9770: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9780: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9790: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
97a0: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
97b0: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
97c0: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
97d0: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
97e0: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9810: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
9820: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9830: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9840: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9850: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
9860: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
9870: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9890: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
98a0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
98b0: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
98c0: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
98d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
98e0: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
98f0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
9900: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
9910: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
9920: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9930: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9940: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9950: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9960: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9970: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9980: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9990: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
99a0: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
99b0: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
99c0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
99d0: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
99e0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
99f0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
9a00: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
9a10: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
9a20: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9a30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9a40: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9a50: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
9a60: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
9a70: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9a80: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9a90: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9aa0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9ab0: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9ac0: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9ae0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9af0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9b00: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9b10: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
9b20: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9b30: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9b40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b50: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
9b60: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
9b70: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b80: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9b90: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9ba0: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9bb0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9bc0: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9bd0: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9be0: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9bf0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9c00: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9c10: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
9c20: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9c30: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9c40: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9c50: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
9c60: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
9c70: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9c80: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9c90: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9ca0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9cb0: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9cf0: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9d00: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9d10: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
9d20: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9d30: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9d40: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9d50: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
9d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9d70: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9d80: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9d90: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9da0: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9db0: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9dc0: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9dd0: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9de0: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9df0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9e00: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9e10: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
9e20: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9e30: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9e40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9e50: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
9e60: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9e70: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9e80: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9e90: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9ea0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9eb0: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9ec0: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9ed0: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9ee0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ef0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9f00: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9f10: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9f20: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9f30: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9f40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9f50: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9f60: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9f70: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9f80: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9f90: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9fa0: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9fb0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9fc0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9fe0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9ff0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
a000: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a010: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
a020: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
a030: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
a040: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
a050: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
a060: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a070: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
a080: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a090: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
a0a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a0b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a0c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
a0d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0e0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
a0f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a100: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
a110: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
a120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
a130: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
a140: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
a150: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
a160: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
a170: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
a180: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
a190: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
a1a0: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
a1b0: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
a1c0: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
a1d0: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
a1e0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
a1f0: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
a200: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
a210: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
a220: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
a230: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
a240: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
a250: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
a260: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
a270: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
a280: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
a290: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
a2a0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
a2b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a2c0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
a2d0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
a2e0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
a2f0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
a300: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
a310: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
a320: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
a330: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
a340: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
a350: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
a360: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a370: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
a380: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
a390: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
a3a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
a3b0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
a3c0: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
a3d0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
a3e0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
a3f0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
a400: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
a410: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
a420: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
a430: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a440: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a450: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
a460: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
a470: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a480: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a490: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a4a0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a4b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a4c0: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a4d0: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a4e0: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a4f0: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a510: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a520: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a530: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a540: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a550: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a560: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a570: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a580: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a590: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a5a0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a5b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a5c0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a5d0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a5e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5f0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a600: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a610: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a620: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a630: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a640: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a660: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a670: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a680: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a690: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a6a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a6c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a6d0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a6e0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6f0: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a700: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a710: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a720: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a730: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a740: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a750: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a760: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a770: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a780: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a790: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a7a0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a7b0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a7c0: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a7d0: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a7e0: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a800: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a810: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a820: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a830: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a840: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a850: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a860: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a870: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a880: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a890: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a8a0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a8b0: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a8c0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a8d0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a8e0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a8f0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a900: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a910: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a920: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a930: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a940: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a950: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a960: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a970: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a980: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a990: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a9a0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a9b0: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a9c0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9d0: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a9e0: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a9f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
aa00: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
aa30: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
aa40: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
aa50: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
aa60: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
aa70: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
aa80: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
aa90: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
aaa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aab0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
aac0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
aad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
aae0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
aaf0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
ab00: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
ab10: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
ab30: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
ab40: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
ab50: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab60: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
ab70: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
ab80: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
ab90: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
aba0: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
abb0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
abc0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
abd0: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
abe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
abf0: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
ac00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac10: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
ac20: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
ac30: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac40: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
ac50: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
ac60: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
ac70: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ac80: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
ac90: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
aca0: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
acb0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
acc0: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
acd0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
ace0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
acf0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
ad00: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
ad10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad20: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
ad30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
ad40: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
ad50: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
ad60: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
ad70: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
ad80: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
ad90: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
ada0: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
adb0: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
adc0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
add0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
ade0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adf0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ae00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae10: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ae20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ae30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae40: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
ae50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
ae60: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae70: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ae80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae90: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aea0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aeb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aec0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aed0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aee0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aef0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af10: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
af20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af30: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af40: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af60: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af70: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
af80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af90: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
afa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afb0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
afc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
afd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afe0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
aff0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b000: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b010: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b020: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b030: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b040: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b050: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b060: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b070: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b080: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b090: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b0a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0b0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b0c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0d0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0e0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b100: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b110: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
b120: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
b130: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
b140: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
b150: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
b160: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
b170: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
b180: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
b190: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
b1a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
b1b0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
b1c0: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
b1d0: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
b1e0: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
b1f0: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
b200: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
b210: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
b220: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
b230: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
b250: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
b260: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
b270: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
b280: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b290: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
b2a0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
b2b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
b2c0: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
b2d0: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
b2e0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
b2f0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
b300: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
b310: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
b320: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
b330: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
b340: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
b350: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
b360: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
b370: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
b380: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
b390: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
b3a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
b3b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b3c0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
b3d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
b3e0: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
b3f0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
b400: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
b410: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
b420: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
b430: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b440: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
b450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
b460: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
b470: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b480: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b490: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b4a0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b4b0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b4c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b4d0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b4e0: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b4f0: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b500: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b510: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b520: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b530: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b540: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b550: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b560: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b570: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b580: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b590: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b5a0: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b5b0: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b5c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b5d0: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b5e0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b5f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b600: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b610: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b620: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b630: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b640: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b650: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b660: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b670: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b680: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b690: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b6a0: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b6b0: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b6c0: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b6d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b6e0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b6f0: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b700: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b710: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b720: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b730: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b740: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b750: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b760: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b770: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b780: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b790: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b7a0: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b7b0: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b7c0: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b7f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b800: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b810: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b820: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b830: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b840: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b850: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b860: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b870: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b880: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b890: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b8b0: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b8c0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b8d0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8e0: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b8f0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b900: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b910: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b920: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b930: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b940: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b950: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b960: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b970: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b980: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b990: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b9a0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b9b0: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b9c0: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b9d0: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b9e0: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b9f0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
ba00: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
ba10: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
ba20: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
ba30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba40: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
ba50: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
ba60: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
ba70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ba80: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
ba90: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
baa0: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
bab0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
bac0: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
bad0: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
bae0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
baf0: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
bb00: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
bb10: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
bb30: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
bb40: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
bb50: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
bb60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
bb70: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
bb80: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
bb90: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
bba0: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
bbb0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bbc0: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
bbd0: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
bbe0: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
bbf0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
bc00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bc10: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
bc20: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
bc30: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
bc40: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
bc50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc70: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
bc80: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
bc90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
bca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bcb0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
bcc0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
bcd0: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
bce0: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
bcf0: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
bd00: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
bd10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bd20: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
bd30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bd40: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
bd50: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
bd60: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
bd70: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
bd80: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
bd90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bda0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
bdb0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
bdc0: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
bdd0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
bde0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
bdf0: 72 6e 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d  rn;.  if( zTail=
be00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
be10: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
be20: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
be30: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
be40: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
be50: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
be60: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
be70: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
be80: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
be90: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
bea0: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
beb0: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
bec0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
bed0: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
bee0: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
bef0: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
bf00: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
bf10: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
bf20: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
bf30: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
bf40: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
bf50: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
bf60: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
bf70: 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f  tring z[] has no
bf80: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73  thing but whites
bf90: 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  pace and comment
bfa0: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  s to the.** end 
bfb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  of the first lin
bfc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bfd0: 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63   wsToEol(const c
bfe0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
bff0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
c000: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
c010: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65   z[i]=='\n' ) re
c020: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
c030: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20  IsSpace(z[i]) ) 
c040: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
c050: 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[i]=='-' && z
c060: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74  [i+1]=='-' ) ret
c070: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
c080: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
c090: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
c0a0: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c0b0: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
c0c0: 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a  RY PLAN data.*/.
c0d0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c0e0: 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74  append(ShellStat
c0f0: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c100: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
c110: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
c120: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65  EQPGraphRow *pNe
c130: 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d  w;.  int nText =
c140: 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29   strlen30(zText)
c150: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45  ;.  if( p->autoE
c160: 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74  QPtest ){.    ut
c170: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c180: 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20  , "%d,%d,%s\n", 
c190: 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78  iEqpId, p2, zTex
c1a0: 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d  t);.  }.  pNew =
c1b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c1c0: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
c1d0: 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66   + nText );.  if
c1e0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c  ( pNew==0 ) shel
c1f0: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
c200: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49  );.  pNew->iEqpI
c210: 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e  d = iEqpId;.  pN
c220: 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20  ew->iParentId = 
c230: 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  p2;.  memcpy(pNe
c240: 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c  w->zText, zText,
c250: 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65   nText+1);.  pNe
c260: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
c270: 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  if( p->sGraph.pL
c280: 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47  ast ){.    p->sG
c290: 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78  raph.pLast->pNex
c2a0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73  t = pNew;.  }els
c2b0: 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68  e{.    p->sGraph
c2c0: 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20  .pRow = pNew;.  
c2d0: 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  }.  p->sGraph.pL
c2e0: 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  ast = pNew;.}../
c2f0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65  *.** Free and re
c300: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c310: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20  QUERY PLAN data 
c320: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f  that has been co
c330: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d  llected.** in p-
c340: 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74  >sGraph..*/.stat
c350: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65  ic void eqp_rese
c360: 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
c370: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c380: 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pRow, *pNext;. 
c390: 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73   for(pRow = p->s
c3a0: 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77  Graph.pRow; pRow
c3b0: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c3c0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f  .    pNext = pRo
c3d0: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  w->pNext;.    sq
c3e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29  lite3_free(pRow)
c3f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
c400: 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69  p->sGraph, 0, si
c410: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29  zeof(p->sGraph))
c420: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c430: 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20  he next EXPLAIN 
c440: 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20  QUERY PLAN line 
c450: 77 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74  with iEqpId that
c460: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c470: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c480: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c490: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c4a0: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c4b0: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c4c0: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c4d0: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c4e0: 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20  Id, EQPGraphRow 
c4f0: 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61  *pOld){.  EQPGra
c500: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f  phRow *pRow = pO
c510: 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74  ld ? pOld->pNext
c520: 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f   : p->sGraph.pRo
c530: 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77  w;.  while( pRow
c540: 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e   && pRow->iParen
c550: 74 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52  tId!=iEqpId ) pR
c560: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c570: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b  ;.  return pRow;
c580: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20  .}../* Render a 
c590: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
c5a0: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68  the graph that h
c5b0: 61 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73  as iEqpId as its
c5c0: 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64   parent.  Called
c5d0: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20  .** recursively 
c5e0: 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76  to render sublev
c5f0: 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  els..*/.static v
c600: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c  oid eqp_render_l
c610: 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  evel(ShellState 
c620: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b  *p, int iEqpId){
c630: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c640: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c650: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
c660: 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  (p->sGraph.zPref
c670: 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ix);.  char *z;.
c680: 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70    for(pRow = eqp
c690: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c6a0: 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  pId, 0); pRow; p
c6b0: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
c6c0: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
c6d0: 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64  xt_row(p, iEqpId
c6e0: 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  , pRow);.    z =
c6f0: 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20   pRow->zText;.  
c700: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c710: 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22  >out, "%s%s%s\n"
c720: 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  , p->sGraph.zPre
c730: 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d  fix, pNext ? "|-
c740: 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a  -" : "`--", z);.
c750: 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73      if( n<(int)s
c760: 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e  izeof(p->sGraph.
c770: 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20  zPrefix)-7 ){.  
c780: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
c790: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c7a0: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
c7b0: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
c7c0: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c7d0: 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71  vel(p, pRow->iEq
c7e0: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  pId);.      p->s
c7f0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c800: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
c820: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45   and reset the E
c830: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c840: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c850: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c860: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c870: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c880: 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68  pRow = p->sGraph
c890: 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f  .pRow;.  if( pRo
c8a0: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  w ){.    if( pRo
c8b0: 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27  w->zText[0]=='-'
c8c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
c8d0: 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a  ow->pNext==0 ){.
c8e0: 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65          eqp_rese
c8f0: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
c900: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c910: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c920: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
c930: 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a  pRow->zText+3);.
c940: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c950: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c960: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
c970: 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20  3_free(pRow);.  
c980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
c990: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c9a0: 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e  t, "QUERY PLAN\n
c9b0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ");.    }.    p-
c9c0: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c9d0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f  0] = 0;.    eqp_
c9e0: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c9f0: 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65  0);.    eqp_rese
ca00: 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  t(p);.  }.}..#if
ca10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ca20: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
ca30: 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73  CK./*.** Progres
ca40: 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  s handler callba
ca50: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
ca60: 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  t progress_handl
ca70: 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  er(void *pClient
ca80: 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53  Data) {.  ShellS
ca90: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
caa0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
cab0: 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65  ta;.  p->nProgre
cac0: 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ss++;.  if( p->n
cad0: 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50  Progress>=p->mxP
cae0: 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78  rogress && p->mx
caf0: 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20  Progress>0 ){.  
cb00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cb10: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c  out, "Progress l
cb20: 69 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75  imit reached (%u
cb30: 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  )\n", p->nProgre
cb40: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ss);.    if( p->
cb50: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cb60: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53  ELL_PROGRESS_RES
cb70: 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ET ) p->nProgres
cb80: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
cb90: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cba0: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f  SHELL_PROGRESS_O
cbb0: 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72  NCE ) p->mxProgr
cbc0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ess = 0;.    ret
cbd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
cbe0: 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73   (p->flgProgress
cbf0: 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53   & SHELL_PROGRES
cc00: 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20  S_QUIET)==0 ){. 
cc10: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
cc20: 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20  >out, "Progress 
cc30: 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72  %u\n", p->nProgr
cc40: 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ess);.  }.  retu
cc50: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
cc60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
cc70: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20  OGRESS_CALLBACK 
cc80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
cc90: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
cca0: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
ccb0: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
ccc0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
ccd0: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ccf0: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
cd00: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
cd10: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
cd20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
cd30: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
cd40: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
cd50: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
cd60: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
cd70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
cd80: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
cd90: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
cda0: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
cdb0: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
cdc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
cdd0: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
cde0: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
cdf0: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
ce00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
ce10: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
ce20: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
ce30: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
ce40: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
ce50: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
ce60: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
ce70: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
ce80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
ce90: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
cea0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
ceb0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
cec0: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
ced0: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
cee0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
cef0: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
cf00: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
cf10: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
cf20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cf30: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cf40: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
cf50: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cf60: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
cf70: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cf80: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cf90: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cfa0: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cfb0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cfc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cfd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cfe0: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cff0: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
d000: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
d010: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
d020: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
d030: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
d040: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
d050: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
d060: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
d070: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
d080: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
d090: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d0a0: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
d0b0: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d0c0: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
d0d0: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
d0e0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
d0f0: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d100: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d120: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d130: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
d140: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
d150: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
d160: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
d170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d180: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
d190: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d1a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d1b0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
d1c0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
d1d0: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d1e0: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
d200: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
d210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d220: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
d230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d240: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
d250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
d260: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
d270: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d280: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d290: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
d2a0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
d2b0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
d2c0: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
d2d0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d2e0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d300: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
d310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d320: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d330: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
d340: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
d350: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
d360: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
d370: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d380: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d390: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d3a0: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d3b0: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d3d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d3e0: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d3f0: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d420: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d430: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d440: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d460: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d470: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d480: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d4a0: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d4b0: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d4c0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d4d0: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d500: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d510: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d520: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d530: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d550: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5f0: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d600: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d610: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d630: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d640: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d660: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d670: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d680: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d690: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d6a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d6b0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d6c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d6d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d6e0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d700: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d710: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d720: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d730: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d740: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d750: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d770: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d780: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d790: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d7a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d7b0: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d7d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d7e0: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d7f0: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d800: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d810: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d820: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d840: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d850: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d860: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d870: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d880: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d890: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d8a0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d8b0: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d8c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d8e0: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d8f0: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d900: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d910: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d920: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d930: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d940: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d950: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d960: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d970: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d980: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d990: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d9a0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d9b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d9c0: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d9d0: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d9e0: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d9f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
da00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
da10: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
da20: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
da30: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
da40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
da50: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
da60: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
da70: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
da80: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
da90: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
daa0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
dab0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
dac0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
dad0: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
dae0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
daf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
db00: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
db10: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
db20: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
db30: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
db40: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
db50: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
db60: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
db70: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
db80: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
db90: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
dba0: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
dbb0: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
dbc0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
dbd0: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
dbe0: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
dbf0: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
dc00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dc10: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
dc20: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
dc30: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dc40: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dc50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc60: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
dc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
dc80: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
dc90: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
dca0: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
dcb0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
dcc0: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
dcd0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
dce0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
dcf0: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
dd00: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
dd10: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
dd20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
dd30: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
dd40: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dd50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dd60: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
dd70: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
dd80: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
dd90: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
dda0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddb0: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
ddc0: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
ddd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dde0: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
ddf0: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
de00: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
de10: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
de20: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
de30: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
de40: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
de50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
de60: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
de70: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
de80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
de90: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
dea0: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
dec0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
ded0: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
dee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
def0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
df10: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
df20: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
df30: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
df40: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
df50: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
df60: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
df70: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
df80: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
df90: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
dfa0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
dfb0: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
dfc0: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
dfd0: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
dfe0: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
dff0: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
e000: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
e010: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
e020: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
e030: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
e040: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
e060: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
e070: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
e080: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
e090: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
e0a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e0c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e0d0: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
e0e0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e0f0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e100: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e110: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e130: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e140: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
e150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e160: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
e170: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
e180: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e190: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e1a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e1b0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e1c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e1d0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e1e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e1f0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
e200: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
e210: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
e220: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e230: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e240: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
e250: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
e260: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e270: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e280: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e2b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e2c0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e2d0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
e2e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e2f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e300: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
e310: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e320: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e330: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e340: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e350: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e360: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e370: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e380: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e390: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e3a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e3b0: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e3c0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e3d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
e3e0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e3f0: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e410: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e420: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e430: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e440: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e450: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e460: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e470: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e480: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e490: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e4a0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e4b0: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e4c0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e4d0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e4e0: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e4f0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e500: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e510: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e530: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e540: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e560: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e570: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e580: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e590: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e5a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e5b0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e5c0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e5d0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e5e0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e5f0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e600: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e610: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e620: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e630: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e650: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e660: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e670: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e680: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e690: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e6a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e6b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e6c0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e6d0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e6e0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e6f0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e700: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e710: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e720: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e730: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
e750: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e760: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e770: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e790: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e7a0: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e7b0: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e7d0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e7e0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e7f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e800: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e810: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e820: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e830: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e840: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e850: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e860: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e870: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e880: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e890: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e8b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e8d0: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e8e0: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e900: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e910: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e920: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e930: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e940: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e960: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e970: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e980: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e990: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e9a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e9b0: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e9c0: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e9d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e9e0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e9f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ea00: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
ea10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ea20: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ea30: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ea40: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea50: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
ea60: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
ea70: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
ea90: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
eaa0: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
eab0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
eac0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ead0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
eae0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
eaf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
eb00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
eb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
eb20: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
eb30: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
eb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eb50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb60: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
eb70: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
eb80: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
eb90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eba0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ebb0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ebc0: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
ebd0: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
ebe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
ebf0: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
ec00: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ec10: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
ec20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
ec30: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ec40: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
ec50: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ec60: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ec70: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
ec80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
ec90: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
eca0: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
ecc0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ecd0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ece0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
ecf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ed00: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ed10: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
ed20: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
ed30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ed40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ed50: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ed60: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
ed70: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
ed80: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ed90: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
eda0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
edb0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
edc0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
edd0: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ede0: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
edf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ee00: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ee10: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ee20: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ee30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
ee40: 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20  t64 ur;.        
ee50: 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c    memcpy(&ur,&r,
ee60: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20  sizeof(r));.    
ee70: 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78        if( ur==0x
ee80: 37 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30  7ff0000000000000
ee90: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
eea0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
eeb0: 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20  out, "1e999");. 
eec0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
eed0: 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30  f( ur==0xfff0000
eee0: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
eef0: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
ef00: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d  rintf(p->out, "-
ef10: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ef20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ef40: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
ef50: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
ef60: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ef70: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ef80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ef90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
efa0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
efb0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
efc0: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
efd0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
efe0: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
eff0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
f000: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
f010: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
f020: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
f030: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
f040: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f050: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
f060: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
f070: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
f080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
f090: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f0a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f0b0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f0c0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f0d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f0e0: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
f0f0: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
f100: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
f110: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f120: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f130: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f150: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f160: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
f170: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f180: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
f190: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
f1a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
f1b0: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
f1c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f1d0: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
f1e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
f1f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f200: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
f210: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f220: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f230: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f240: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f250: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
f260: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
f270: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f280: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f290: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
f2a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f2b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f2c0: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
f2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
f2e0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
f2f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f300: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f310: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
f320: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
f330: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
f340: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
f350: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f360: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
f370: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f380: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
f390: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
f3a0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f3b0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f3c0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
f3d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f3e0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f3f0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f400: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f410: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f420: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
f430: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f440: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f450: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f460: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f470: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f480: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f490: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
f4a0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
f4b0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
f4c0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
f4d0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
f4e0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f500: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
f510: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
f520: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f530: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
f540: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f550: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f560: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
f570: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
f580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f590: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
f5a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f5b0: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
f5c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
f5d0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f5e0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f5f0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f600: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f610: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f620: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f630: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f640: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f650: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f660: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f670: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f680: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
f6a0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f6b0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f6c0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f6e0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f6f0: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
f700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f710: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
f720: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
f730: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
f740: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
f750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f760: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f770: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
f780: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f790: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
f7a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f7b0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f7c0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
f7d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
f7e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
f7f0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
f800: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f810: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f820: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
f830: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
f840: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f850: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f860: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f870: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f880: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f890: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f8a0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
f8b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f8c0: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
f8d0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
f8e0: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
f8f0: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
f900: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f910: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f920: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f930: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f940: 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20  MODE_EQP: {.    
f950: 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20    eqp_append(p, 
f960: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
f970: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20  atoi(azArg[1]), 
f980: 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20  azArg[3]);.     
f990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f9b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
f9c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
f9d0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
f9e0: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
f9f0: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
fa00: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
fa10: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
fa20: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
fa30: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
fa40: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
fa50: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
fa60: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
fa70: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
fa80: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
fa90: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
faa0: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
fab0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
fac0: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
fad0: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
fae0: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
faf0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
fb00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
fb10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78   from sqlite3_ex
fb20: 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64  ec() that append
fb30: 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20  s all.** output 
fb40: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
fb50: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
fb60: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
fb70: 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  t captureOutputC
fb80: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
fb90: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
fba0: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fbb0: 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54   **az){.  ShellT
fbc0: 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54  ext *p = (ShellT
fbd0: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ext*)pArg;.  int
fbe0: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
fbf0: 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66  AMETER(az);.  if
fc00: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
fc10: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
fc20: 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  n ) appendText(p
fc30: 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72  , "|", 0);.  for
fc40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
fc50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20  +){.    if( i ) 
fc60: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c  appendText(p, ",
fc70: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
fc80: 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64  zArg[i] ) append
fc90: 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d  Text(p, azArg[i]
fca0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
fcb0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
fcc0: 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f  enerate an appro
fcd0: 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20  priate SELFTEST 
fce0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
fcf0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  n database..*/.s
fd00: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
fd10: 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53  eSelftestTable(S
fd20: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
fd30: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fd40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   0;.  sqlite3_ex
fd50: 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53  ec(p->db,.    "S
fd60: 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73  AVEPOINT selftes
fd70: 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22  t_init;\n".    "
fd80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
fd90: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74  NOT EXISTS selft
fda0: 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74  est(\n".    "  t
fdb0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
fdc0: 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20  RY KEY,\n"   /* 
fdd0: 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Test number */. 
fde0: 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e     "  op TEXT,\n
fdf0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fe00: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a      /* Operator:
fe10: 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20    memo run */.  
fe20: 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e    "  cmd TEXT,\n
fe30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fe40: 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65     /* Command te
fe50: 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73  xt */.    "  ans
fe60: 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20   TEXT\n"        
fe70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
fe80: 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a  sired answer */.
fe90: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52      ");".    "CR
fea0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
feb0: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70  [_shell$self](op
fec0: 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20  ,cmd,ans);\n".  
fed0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fee0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77  _shell$self](row
fef0: 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20  id,op,cmd)\n".  
ff00: 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c    "  VALUES(coal
ff10: 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61  esce((SELECT (ma
ff20: 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46  x(tno)+100)/10 F
ff30: 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30  ROM selftest),10
ff40: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  ),\n".    "     
ff50: 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74      'memo','Test
ff60: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d  s generated by -
ff70: 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20  -init');\n".    
ff80: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
ff90: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
ffa0: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
ffb0: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27  ',\n".    "    '
ffc0: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
ffd0: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74  query(''SELECT t
ffe0: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
fff0: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
10020 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
10030 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27  ER BY 2'',224))'
10040 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
10050 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45  x(sha3_query('SE
10060 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
10070 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
100a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
100b0 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e  R BY 2',224));\n
100c0 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
100d0 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
100e0 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
100f0 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20  T 'run',".    " 
10100 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10110 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10120 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c  CT * FROM \"' ||
10130 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70  ".    "        p
10140 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29  rintf('%w',name)
10150 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45   || '\" NOT INDE
10160 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  XED'',224))',\n"
10170 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
10180 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28  a3_query(printf(
10190 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
101a0 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  "%w\" NOT INDEXE
101b0 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e  D',name),224))\n
101c0 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c  ".    "  FROM (\
101d0 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  n".    "    SELE
101e0 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
101f0 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20  ite_master\n".  
10200 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79    "     WHERE ty
10210 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20  pe='table'\n".  
10220 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61    "       AND na
10230 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e  me<>'selftest'\n
10240 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
10250 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
10260 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20  age,0)>0\n".    
10270 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52  "  )\n".    " OR
10280 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a  DER BY name;\n".
10290 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
102a0 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
102b0 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
102c0 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e  'run','PRAGMA in
102d0 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27  tegrity_check','
102e0 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ok');\n".    "IN
102f0 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65  SERT INTO selfte
10300 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e  st(tno,op,cmd,an
10310 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  s)".    "  SELEC
10320 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d  T rowid*10,op,cm
10330 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65  d,ans FROM [_she
10340 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20  ll$self];\n".   
10350 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73   "DROP TABLE [_s
10360 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20  hell$self];".   
10370 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b   ,0,0,&zErrMsg);
10380 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10390 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
103a0 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54  f(stderr, "SELFT
103b0 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  EST initializati
103c0 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e  on failure: %s\n
103d0 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
103e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
103f0 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71  rrMsg);.  }.  sq
10400 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
10410 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74  , "RELEASE selft
10420 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29  est_init",0,0,0)
10430 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
10440 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
10450 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74  table field of t
10460 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74  he ShellState st
10470 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68  ructure to.** th
10480 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
10490 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61  ble given.  Esca
104a0 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61  pe any quote cha
104b0 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a  racters in the.*
104c0 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f  * table name..*/
104d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
104e0 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c  _table_name(Shel
104f0 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
10500 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
10510 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61   int i, n;.  cha
10520 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
10530 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
10540 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
10550 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
10560 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
10570 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
10580 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
10590 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f  ) return;.  cQuo
105a0 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
105b0 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72  Name);.  n = str
105c0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
105d0 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b  if( cQuote ) n +
105e0 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e  = n+2;.  z = p->
105f0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
10600 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
10610 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ( z==0 ) shell_o
10620 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
10630 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
10640 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
10650 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
10660 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
10670 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
10680 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
10690 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
106a0 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
106b0 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
106c0 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
106d0 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
106e0 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
106f0 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
10700 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10710 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
10720 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
10730 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
10740 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
10750 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
10760 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
10770 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
10780 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
10790 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
107a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
107b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
107c0 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
107d0 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
107e0 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
107f0 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
10800 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
10810 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
10820 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
10830 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
10840 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10850 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
10860 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
10870 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
10880 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
10890 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
108a0 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
108b0 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
108c0 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
108d0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
108e0 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
108f0 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
10900 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
10910 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
10920 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
10930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
10940 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
10950 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
10960 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
10970 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
10980 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
10990 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
109a0 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
109b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
109c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
109d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
109e0 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
109f0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10a00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10a10 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
10a20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10a30 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
10a40 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
10a50 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10a70 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10a80 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
10a90 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10aa0 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10ab0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
10ac0 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
10ad0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10ae0 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
10af0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10b00 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
10b10 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10b20 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
10b30 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
10b40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
10b50 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
10b60 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
10b70 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
10b80 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
10b90 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10ba0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10bb0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
10bc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10bd0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
10be0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
10bf0 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
10c00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10c10 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
10c20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10c30 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
10c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
10c50 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
10c60 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
10c70 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
10c80 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
10c90 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
10ca0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10cb0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
10cc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10cd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10ce0 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
10cf0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10d00 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10d10 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
10d20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10d30 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
10d40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d50 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10d60 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10d70 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10d80 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10da0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10db0 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10dc0 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10dd0 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10de0 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
10df0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10e00 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
10e10 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
10e20 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
10e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
10e40 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
10e50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
10e60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10e70 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10e80 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
10e90 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
10ea0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10eb0 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
10ec0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
10ed0 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
10ee0 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10ef0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
10f00 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
10f10 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
10f20 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
10f30 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
10f40 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
10f50 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
10f60 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
10f70 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
10f80 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
10f90 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
10fa0 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
10fb0 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
10fc0 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
10fd0 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
10fe0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10ff0 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
11000 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
11010 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
11020 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
11030 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
11040 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
11050 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
11060 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
11070 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
11080 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11090 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
110a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
110b0 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
110c0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
110d0 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
110e0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
110f0 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
11100 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
11110 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11130 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
11140 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
11150 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
11180 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
11190 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
111a0 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
111b0 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
111c0 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
111d0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
111e0 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
111f0 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11200 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
11210 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
11220 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
11230 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
11240 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
11250 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
11260 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
11270 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
11280 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
11290 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
112a0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
112b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
112c0 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
112d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
112e0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
112f0 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
11310 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
11320 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
11330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
11340 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11350 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
11360 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
11370 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
11380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11390 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
113a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
113b0 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
113c0 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
113d0 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
113e0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
113f0 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
11400 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
11410 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
11420 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
11430 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
11440 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
11450 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
11460 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
11470 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
11480 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
11490 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
114a0 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
114b0 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
114c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
114d0 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
114e0 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
114f0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11500 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
11510 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
11520 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
11530 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
11540 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11550 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
11560 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
11570 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
11580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
11590 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
115a0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
115b0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
115c0 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
115d0 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
115e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
115f0 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
11600 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
11610 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
11620 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11630 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
11640 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
11650 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
11660 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
11670 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11680 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
11690 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
116a0 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
116b0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
116c0 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
116d0 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
116e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
116f0 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
11700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11710 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
11720 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11740 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
11750 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
11760 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
11770 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
11780 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
11790 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
117a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
117b0 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
117c0 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
117d0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
117e0 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f  Hiwtr;.  FILE *o
117f0 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d  ut;.  if( pArg==
11800 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d  0 || pArg->out==
11810 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11820 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b  out = pArg->out;
11830 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
11840 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74  tmt && (pArg->st
11850 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20  atsOn & 2) ){.  
11860 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78    int nCol, i, x
11870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
11880 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67  mt *pStmt = pArg
11890 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61  ->pStmt;.    cha
118a0 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43  r z[100];.    nC
118b0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
118c0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
118d0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
118e0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c  (out, "%-36s %d\
118f0 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f  n", "Number of o
11900 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c  utput columns:",
11910 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
11920 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11940 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
11950 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64  (z),z,"Column %d
11960 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78   %nname:", i, &x
11970 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11980 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11990 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
119a0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
119b0 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65  Stmt,i));.#ifnde
119c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
119d0 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c  CLTYPE.      sql
119e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
119f0 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64  , z+x, "declared
11a00 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20   type:");.      
11a10 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
11a20 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
11a30 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
11a40 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c  _decltype(pStmt,
11a50 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i));.#endif.#if
11a60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11a70 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
11a80 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  A.      sqlite3_
11a90 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11aa0 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65  , "database name
11ab0 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11ac0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ad0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11ae0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
11af0 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  base_name(pStmt,
11b00 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11b10 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11b20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65  z+x, "table name
11b30 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11b40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11b50 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11b60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
11b70 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
11b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11b90 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11ba0 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22  , "origin name:"
11bb0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11bc0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11bd0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11be0 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
11bf0 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11c10 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  }..  displayStat
11c20 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f  Line(pArg, "Memo
11c30 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  ry Used:",.     
11c40 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c50 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11c60 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
11c70 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ED, bReset);.  d
11c80 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11c90 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11ca0 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f  Outstanding Allo
11cb0 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20  cations:",.     
11cc0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11cd0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11ce0 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62  _MALLOC_COUNT, b
11cf0 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41  Reset);.  if( pA
11d00 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
11d10 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
11d20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
11d30 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11d40 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
11d50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
11d60 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11d70 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
11d80 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11d90 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
11da0 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61  t);.  }.  displa
11db0 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11dc0 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11dd0 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
11de0 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11df0 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11e00 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11e10 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
11e20 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  OW, bReset);.  d
11e30 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11e40 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c  Arg, "Largest Al
11e50 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
11e60 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
11e70 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11e80 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  LOC_SIZE, bReset
11e90 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  );.  displayStat
11ea0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
11eb0 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
11ec0 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
11ed0 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
11ee0 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11ef0 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
11f00 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
11f10 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
11f20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11f30 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
11f40 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
11f50 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11f60 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
11f70 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
11f80 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
11f90 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b  dif..  if( db ){
11fa0 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
11fb0 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11fc0 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
11fd0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11fe0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
11ff0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12000 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12010 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
12020 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
12030 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
12040 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
12050 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
12060 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12080 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
12090 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
120a0 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
120b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
120c0 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
120d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
120e0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
120f0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12100 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12130 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12140 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12150 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
12160 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
12170 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
12180 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12190 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
121a0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
121b0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
121c0 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
121d0 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12200 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12210 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12220 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12230 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
12240 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
12250 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
12260 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
12270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12280 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12290 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
122a0 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
122b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122c0 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
122d0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
122e0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
122f0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12300 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12310 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
12320 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12330 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
12340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
12350 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12360 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12370 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12380 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12390 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
123a0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
123b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
123c0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
123d0 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
123f0 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12400 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
12410 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12420 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12430 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
12440 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
12450 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
12460 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12470 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12480 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
12490 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124c0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
124d0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
124e0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
124f0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12500 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
12510 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12520 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12530 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
12540 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12570 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12580 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12590 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
125a0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
125b0 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
125c0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
125d0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
125e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
125f0 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12620 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12630 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12640 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
12650 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
12660 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69  _CACHE_SPILL, &i
12670 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
12680 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12690 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
126a0 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20  e cache spills: 
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
126d0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
126e0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
126f0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12700 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12710 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
12720 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12730 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12740 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12750 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55  , "Schema Heap U
12760 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
12770 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
12780 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12790 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
127a0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
127b0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
127c0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
127d0 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
127e0 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
127f0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12800 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12810 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
12820 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
12830 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
12840 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
12850 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
12860 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  }..  if( pArg->p
12870 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
12880 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12890 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
128a0 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
128b0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
128c0 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
128f0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12900 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
12910 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12930 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12940 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12950 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12960 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12970 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
12980 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12990 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
129a0 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
129b0 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
129c0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
129d0 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
129e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
129f0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12a00 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12a10 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
12a20 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12a30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12a40 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
12a50 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
12a60 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12a70 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12a80 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12a90 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12aa0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12ab0 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
12ac0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12ad0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12ae0 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
12af0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
12b00 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12b10 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12b20 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12b30 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12b40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12b50 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73  _REPREPARE, bRes
12b60 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12b70 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12b80 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74  Reprepare operat
12b90 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12ba0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12bb0 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12bc0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12bd0 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12be0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12bf0 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20  _RUN, bReset);. 
12c00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12c10 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
12c20 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20   of times run:  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12c40 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12c50 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12c60 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12c70 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12c80 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53  STMTSTATUS_MEMUS
12c90 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ED, bReset);.   
12ca0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12cb0 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75  ->out, "Memory u
12cc0 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20  sed by prepared 
12cd0 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c  stmt:        %d\
12ce0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
12cf0 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
12d00 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
12d10 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
12d20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12d30 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
12d40 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
12d50 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
12d60 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
12d70 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
12d80 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
12d90 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
12da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12db0 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
12dc0 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
12dd0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12de0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12df0 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
12e00 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
12e30 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
12e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
12e50 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
12e60 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
12e70 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
12e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e90 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
12ea0 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
12eb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12ec0 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
12ed0 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
12ee0 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
12ef0 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
12f00 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
12f10 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
12f20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
12f30 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
12f40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12f50 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
12f60 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
12f70 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
12f80 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
12f90 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
12fa0 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
12fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
12fc0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
12fd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12fe0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12ff0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
13000 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
13010 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
13020 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13030 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13040 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
13050 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
13060 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
13070 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
13080 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
13090 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
130a0 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
130b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
130c0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
130d0 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
130e0 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
130f0 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
13100 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13110 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
13120 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
13130 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
13140 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
13150 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
13160 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
13170 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
13180 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
13190 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
131a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
131b0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
131c0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
131d0 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
131e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
131f0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13200 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13210 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
13220 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
13230 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
13240 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
13250 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
13260 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
13270 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
13280 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
13290 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
132a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
132b0 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
132c0 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
132d0 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
132e0 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
132f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
13300 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
13310 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
13320 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
13330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
13340 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
13350 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
13380 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
13390 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
133a0 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
133b0 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
133c0 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
133d0 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
133e0 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
133f0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
13400 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
13410 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
13420 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
13430 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
13440 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
13450 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
13460 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
13470 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
13480 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
13490 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
134a0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
134b0 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
134c0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
134d0 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
134e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
134f0 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
13500 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
13510 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
13520 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
13530 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
13540 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
13550 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
13560 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
13570 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
13580 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
13590 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
135a0 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
135b0 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
135c0 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
135d0 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
135e0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
135f0 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
13600 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
13610 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
13620 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
13630 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
13640 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
13650 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
13660 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
13670 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
13680 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
13690 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
136a0 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
136b0 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
136c0 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
136d0 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
136e0 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
136f0 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
13700 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
13710 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
13720 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
13730 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
13740 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
13750 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
13760 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
13770 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
13780 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
13790 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
137a0 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
137b0 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
137c0 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
137d0 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
137e0 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
137f0 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
13800 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
13810 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
13820 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
13830 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
13840 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
13850 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13860 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
13870 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
13880 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
13890 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
138a0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
138b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
138c0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
138d0 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
138e0 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
138f0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
13900 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13910 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
13920 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
13930 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
13940 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
13950 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
13960 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
13970 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
139a0 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
139b0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
139c0 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
139d0 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
139e0 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
139f0 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
13a00 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20  "SorterNext", 0 
13a10 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13a20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22  *azYield[] = { "
13a30 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22  Yield", "SeekLT"
13a40 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77  , "SeekGT", "Row
13a50 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20  SetRead",.      
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20        "Rewind", 
13a80 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
13a90 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20  r *azGoto[] = { 
13aa0 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20  "Goto", 0 };..  
13ab0 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  /* Try to figure
13ac0 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20   out if this is 
13ad0 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49  really an EXPLAI
13ae0 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  N statement. If 
13af0 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  this.  ** cannot
13b00 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65   be verified, re
13b10 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  turn early.  */.
13b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
13b30 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29  lumn_count(pSql)
13b40 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d  !=8 ){.    p->cM
13b50 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13b60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13b70 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13b80 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
13b90 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13ba0 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
13bb0 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
13bc0 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
13bd0 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
13be0 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
13bf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13c00 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
13c10 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70  in", 7) ){.    p
13c20 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13c30 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13c40 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b   }..  for(iOp=0;
13c50 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
13c60 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b  ite3_step(pSql);
13c70 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74   iOp++){.    int
13c80 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64   i;.    int iAdd
13c90 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
13ca0 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b  mn_int(pSql, 0);
13cb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13cc0 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
13cd0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13ce0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
13cf0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32  ;..    /* Set p2
13d00 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64   to the P2 field
13d10 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
13d20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73  opcode. Then, as
13d30 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20  suming that.    
13d40 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74  ** p2 is an inst
13d50 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  ruction address,
13d60 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32   set variable p2
13d70 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  op to the index 
13d80 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  of that.    ** i
13d90 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13da0 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e aiIndent[] arr
13db0 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20  ay. p2 and p2op 
13dc0 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
13dd0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   if.    ** the c
13de0 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69  urrent instructi
13df0 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
13e00 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65  sub-program gene
13e10 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20  rated by an.    
13e20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f  ** SQL trigger o
13e30 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  r foreign key.  
13e40 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20  */.    int p2 = 
13e50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13e60 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  nt(pSql, 3);.   
13e70 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20   int p2op = (p2 
13e80 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a  + (iOp-iAddr));.
13e90 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
13ea0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72   p->aiIndent arr
13eb0 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a  ay as required *
13ec0 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e  /.    if( iOp>=n
13ed0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
13ee0 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  f( iOp==0 ){.   
13ef0 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68       /* Do furth
13f00 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74  er verfication t
13f10 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c  hat this is expl
13f20 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f  ain output.  Abo
13f30 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  rt if.        **
13f40 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20   it is not */.  
13f50 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
13f60 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  st char *explain
13f70 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Cols[] = {.     
13f80 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
13f90 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
13fa0 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
13fb0 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20  "p5", "comment" 
13fc0 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  };.        int j
13fd0 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
13fe0 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a  j=0; jj<ArraySiz
13ff0 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20  e(explainCols); 
14000 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
14010 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69   if( strcmp(sqli
14020 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
14030 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e  pSql,jj),explain
14040 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a  Cols[jj])!=0 ){.
14050 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
14060 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
14070 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14080 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
140a0 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
140b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
140c0 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20   }.      nAlloc 
140d0 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d  += 100;.      p-
140e0 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74  >aiIndent = (int
140f0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
14100 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c  c64(p->aiIndent,
14110 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
14120 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14130 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29  p->aiIndent==0 )
14140 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
14150 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62  mory();.      ab
14160 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
14170 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
14180 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
14190 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
141a0 20 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d      if( abYield=
141b0 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
141c0 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
141d0 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f  }.    abYield[iO
141e0 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61  p] = str_in_arra
141f0 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b  y(zOp, azYield);
14200 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .    p->aiIndent
14210 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70  [iOp] = 0;.    p
14220 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b  ->nIndent = iOp+
14230 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f  1;..    if( str_
14240 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
14250 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66  Next) ){.      f
14260 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
14270 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
14280 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
14290 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  }.    if( str_in
142a0 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f  _array(zOp, azGo
142b0 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e  to) && p2op<p->n
142c0 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28  Indent.     && (
142d0 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c  abYield[p2op] ||
142e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
142f0 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20  int(pSql, 2)).  
14300 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69    ){.      for(i
14310 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14320 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14330 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
14340 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  }..  p->iIndent 
14350 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
14360 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20  ree(abYield);.  
14370 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
14380 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ql);.}../*.** Fr
14390 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c  ee the array all
143a0 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69  ocated by explai
143b0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29  n_data_prepare()
143c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
143d0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
143e0 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lete(ShellState 
143f0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
14400 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29  ree(p->aiIndent)
14410 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  ;.  p->aiIndent 
14420 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e  = 0;.  p->nInden
14430 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64  t = 0;.  p->iInd
14440 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
14450 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65  * Disable and re
14460 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63  store .wheretrac
14470 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61  e and .selecttra
14480 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a  ce settings..*/.
14490 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
144a0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
144b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
144c0 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
144d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
144e0 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73  e3SelectTrace;.s
144f0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53  tatic int savedS
14500 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
14510 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14520 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14530 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
14540 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
14550 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
14560 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
14570 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
14580 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
14590 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  if.static void d
145a0 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
145b0 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
145c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
145d0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
145e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
145f0 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14600 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61    savedSelectTra
14610 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ce = sqlite3Sele
14620 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  ctTrace;.  sqlit
14630 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
14640 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
14650 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14660 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14670 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
14680 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  RETRACE).  saved
14690 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c  WhereTrace = sql
146a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
146b0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
146c0 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
146d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
146e0 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
146f0 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14700 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14710 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14720 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14730 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
14740 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
14750 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63  ace = savedSelec
14760 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
14770 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14780 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14790 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
147a0 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
147b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
147c0 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72  e = savedWhereTr
147d0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ace;.#endif.}../
147e0 2a 20 43 72 65 61 74 65 20 74 68 65 20 54 45 4d  * Create the TEM
147f0 50 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  P table used to 
14800 73 74 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20  store parameter 
14810 62 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74  bindings */.stat
14820 69 63 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62  ic void bind_tab
14830 6c 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61  le_init(ShellSta
14840 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72  te *p){.  int wr
14850 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71  Schema = 0;.  sq
14860 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
14870 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  p->db, SQLITE_DB
14880 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
14890 53 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53  SCHEMA, -1, &wrS
148a0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
148b0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
148c0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
148d0 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45  IG_WRITABLE_SCHE
148e0 4d 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  MA, 1, 0);.  sql
148f0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
14900 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
14910 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
14920 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72   temp.sqlite_par
14930 61 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20  ameters(\n".    
14940 22 20 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d  "  key TEXT PRIM
14950 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20  ARY KEY,\n".    
14960 22 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a  "  value ANY\n".
14970 20 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52      ") WITHOUT R
14980 4f 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30  OWID;",.    0, 0
14990 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
149a0 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
149b0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
149c0 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
149d0 2c 20 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a  , wrSchema, 0);.
149e0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61  }../*.** Bind pa
149f0 72 61 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72  rameters on a pr
14a00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14a10 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
14a20 72 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74  r bindings are t
14a30 61 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50  aken from a TEMP
14a40 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f   table of the fo
14a50 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  rm:.**.**    CRE
14a60 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
14a70 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73  qlite_parameters
14a80 28 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52  (key TEXT PRIMAR
14a90 59 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a  Y KEY, value).**
14aa0 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49      WITHOUT ROWI
14ab0 44 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64  D;.**.** No bind
14ac0 69 6e 67 73 20 6f 63 63 75 72 20 69 66 20 74 68  ings occur if th
14ad0 69 73 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  is table does no
14ae0 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 73 70  t exist.  The sp
14af0 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 20  ecial character 
14b00 27 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64  '$'.** is includ
14b10 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ed in the table 
14b20 6e 61 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65  name to help pre
14b30 76 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  vent collisions 
14b40 77 69 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c  with actual tabl
14b50 65 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  es..** The table
14b60 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20   must be in the 
14b70 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  TEMP schema..*/.
14b80 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64  static void bind
14b90 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53  _prepared_stmt(S
14ba0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
14bb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14bc0 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61  Stmt){.  int nVa
14bd0 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
14be0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
14bf0 73 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20  stmt *pQ = 0;.. 
14c00 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
14c10 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
14c20 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  ount(pStmt);.  i
14c30 66 28 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74  f( nVar==0 ) ret
14c40 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67  urn;  /* Nothing
14c50 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20   to do */.  if( 
14c60 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
14c70 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41  lumn_metadata(pA
14c80 72 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20  rg->db, "TEMP", 
14c90 22 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65  "sqlite_paramete
14ca0 72 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rs",.           
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20           "key", 
14cd0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d  0, 0, 0, 0, 0)!=
14ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14cf0 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61   return; /* Para
14d00 6d 65 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73  meter table does
14d10 20 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20   not exist */.  
14d20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14d30 5f 70 72 65 70 61 72 65 5f 76 32 28 70 41 72 67  _prepare_v2(pArg
14d40 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
14d50 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
14d60 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70  OM temp.sqlite_p
14d70 61 72 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20  arameters".     
14d80 20 20 20 20 20 22 20 57 48 45 52 45 20 6b 65 79       " WHERE key
14d90 3d 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30  =?1", -1, &pQ, 0
14da0 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70  );.  if( rc || p
14db0 51 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Q==0 ) return;. 
14dc0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
14dd0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  r; i++){.    cha
14de0 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
14df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
14e00 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
14e10 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
14e20 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
14e30 28 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20  ( zVar==0 ){.   
14e40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
14e50 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29  ntf(sizeof(zNum)
14e60 2c 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a  ,zNum,"?%d",i);.
14e70 20 20 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75        zVar = zNu
14e80 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
14e90 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
14ea0 51 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20  Q, 1, zVar, -1, 
14eb0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
14ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
14ed0 73 74 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45  step(pQ)==SQLITE
14ee0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71  _ROW ){.      sq
14ef0 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
14f00 28 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74  (pStmt, i, sqlit
14f10 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
14f20 70 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c  pQ, 0));.    }el
14f30 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14f40 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
14f50 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, i);.    }.   
14f60 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14f70 51 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  Q);.  }.  sqlite
14f80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a  3_finalize(pQ);.
14f90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70  }../*.** Run a p
14fa0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
14fb0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
14fc0 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
14fd0 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  tmt(.  ShellStat
14fe0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
15010 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
15020 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
15030 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20  mt *pStmt       
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65         /* Statme
15060 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a  nt to run */.){.
15070 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15080 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
15090 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
150a0 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
150b0 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
150c0 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
150d0 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
150e0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
150f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15100 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
15110 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
15120 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
15130 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
15140 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
15150 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
15160 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
15170 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
15180 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
15190 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
151a0 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
151b0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
151c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33  lite3_malloc64(3
151d0 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
151e0 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
151f0 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
15200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15210 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15220 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
15230 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61   **azCols = (cha
15240 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20  r **)pData;     
15250 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73   /* Names of res
15260 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
15270 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61       char **azVa
15280 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f  ls = &azCols[nCo
15290 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  l];       /* Res
152a0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
152b0 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
152c0 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
152d0 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
152e0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
152f0 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65  i, x;.      asse
15300 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
15310 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
15320 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  );.      /* save
15330 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
15340 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
15350 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15360 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15370 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
15380 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
15390 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
153a0 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
153b0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f     do{.        /
153c0 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
153d0 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
153e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  s */.        for
153f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15400 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69  +){.          ai
15410 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
15420 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
15430 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
15440 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
15450 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
15460 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
15470 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
15480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
15490 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
154a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
154b0 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
154c0 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71  s[i] = (char*)sq
154d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
154e0 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
154f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15500 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
15510 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
15520 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
15530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
15540 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15550 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15560 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20  ak; /* from for 
15570 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
15580 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
15590 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
155a0 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74  /* if data and t
155b0 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73  ypes extracted s
155c0 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a  uccessfully... *
155d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  /.        if( SQ
155e0 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
155f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
15600 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
15610 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
15620 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
15630 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
15640 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  if( shell_callba
15650 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61  ck(pArg, nCol, a
15660 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61  zVals, azCols, a
15670 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20  iTypes) ){.     
15680 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15690 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20  TE_ABORT;.      
156a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
156c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
156d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77       }.      } w
156f0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
15700 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
15710 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
15720 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ta);.    }.  }.}
15730 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15740 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
15750 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  LE./*.** This fu
15760 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15770 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
15780 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
15790 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  shell command.**
157a0 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20   was ".expert". 
157b0 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51  It passes the SQ
157c0 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  L in the second 
157d0 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c  argument directl
157e0 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69  y to.** the sqli
157f0 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74  te3expert object
15800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
15810 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
15820 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15830 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
15840 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
15850 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
15860 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20  (*pzErr) may be 
15870 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
15880 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
15890 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73  ing.** an Englis
158a0 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
158b0 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
158c0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
158d0 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
158e0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
158f0 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
15900 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
15910 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
15920 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e  ic int expertHan
15930 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53  dleSQL(.  ShellS
15940 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
15960 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  l, .  char **pzE
15970 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rr.){.  assert( 
15980 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15990 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Expert );.  asse
159a0 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20  rt( pzErr==0 || 
159b0 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72  *pzErr==0 );.  r
159c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78  eturn sqlite3_ex
159d0 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d  pert_sql(pState-
159e0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c  >expert.pExpert,
159f0 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d   zSql, pzErr);.}
15a00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15a10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15a20 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74  either to silent
15a30 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  ly clean up the 
15a40 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65  object.** create
15a50 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72  d by the ".exper
15a60 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62  t" command (if b
15a70 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74  Cancel==1), or t
15a80 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a  o generate a .**
15a90 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20   report from it 
15aa0 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69  and then clean i
15ab0 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c  t up (if bCancel
15ac0 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ==0)..**.** If s
15ad0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
15ae0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15af0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
15b00 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
15b10 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
15b20 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
15b30 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
15b40 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15b50 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
15b60 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
15b70 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
15b80 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15b90 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15ba0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15bb0 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
15bc0 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
15bd0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
15be0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
15bf0 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c  tFinish(.  Shell
15c00 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20  State *pState,. 
15c10 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20   int bCancel,.  
15c20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
15c30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15c40 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65  E_OK;.  sqlite3e
15c50 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74  xpert *p = pStat
15c60 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
15c70 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  t;.  assert( p )
15c80 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e  ;.  assert( bCan
15c90 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20  cel || pzErr==0 
15ca0 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
15cb0 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30    if( bCancel==0
15cc0 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75   ){.    FILE *ou
15cd0 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
15ce0 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
15cf0 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  e = pState->expe
15d00 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20  rt.bVerbose;..  
15d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15d20 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c  xpert_analyze(p,
15d30 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
15d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65  {.      int nQue
15d60 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ry = sqlite3_exp
15d70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20  ert_count(p);.  
15d80 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
15d90 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
15da0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
15db0 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71  char *zCand = sq
15dc0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
15dd0 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52  ort(p,0,EXPERT_R
15de0 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53  EPORT_CANDIDATES
15df0 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
15e00 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43  rintf(out, "-- C
15e10 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d  andidates ------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e30 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
15e40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15e50 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61  out, "%s\n", zCa
15e60 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
15e70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51     for(i=0; i<nQ
15e80 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  uery; i++){.    
15e90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ea0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
15eb0 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
15ec0 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
15ed0 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63  _SQL);.        c
15ee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
15ef0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
15f00 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
15f10 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45  PERT_REPORT_INDE
15f20 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  XES);.        co
15f30 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
15f40 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15f50 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15f60 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29  ERT_REPORT_PLAN)
15f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
15f80 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22  dx==0 ) zIdx = "
15f90 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29  (no new indexes)
15fa0 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \n";.        if(
15fb0 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
15fc0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15fd0 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79  f(out, "-- Query
15fe0 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   %d ------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20  ----\n",i+1);.  
16010 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
16020 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22  tf(out, "%s\n\n"
16030 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
16040 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
16050 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
16060 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20  ", zIdx);.      
16070 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
16080 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b  , "%s\n", zEQP);
16090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   }.  sqlite3_exp
160b0 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a  ert_destroy(p);.
160c0 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
160d0 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20  .pExpert = 0;.  
160e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
160f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
16100 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20  on of ".expert" 
16110 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
16120 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
16130 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
16140 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
16150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
16160 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
16170 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
16180 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
161b0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
161c0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
161d0 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
16200 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
16210 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
16230 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
16240 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
16250 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73  ample = 0;..  as
16260 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
16270 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
16280 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74  );.  memset(&pSt
16290 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20  ate->expert, 0, 
162a0 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66  sizeof(ExpertInf
162b0 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  o));..  for(i=1;
162c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
162d0 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  & i<nArg; i++){.
162e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
162f0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[i];.    int 
16300 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  n;.    if( z[0]=
16310 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
16320 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d  ' ) z++;.    n =
16330 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
16340 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d    if( n>=2 && 0=
16350 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65  =strncmp(z, "-ve
16360 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20  rbose", n) ){.  
16370 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
16380 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  rt.bVerbose = 1;
16390 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
163a0 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
163b0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70  trncmp(z, "-samp
163c0 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  le", n) ){.     
163d0 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29   if( i==(nArg-1)
163e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
163f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16400 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
16410 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
16420 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
16430 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16440 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
16450 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20          iSample 
16460 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
16470 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b  lue(azArg[++i]);
16480 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61  .        if( iSa
16490 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c  mple<0 || iSampl
164a0 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  e>100 ){.       
164b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
164c0 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74  derr, "value out
164d0 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22   of range: %s\n"
164e0 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
164f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16500 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16520 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
16530 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
16540 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
16550 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
16560 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16570 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16580 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
16590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
165a0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
165b0 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Expert = sqlite3
165c0 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61  _expert_new(pSta
165d0 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a  te->db, &zErr);.
165e0 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e      if( pState->
165f0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
16600 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
16610 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
16620 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
16630 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  w: %s\n", zErr);
16640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16650 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
16660 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
16670 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67  e3_expert_config
16680 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61  (.          pSta
16690 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
166a0 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49  rt, EXPERT_CONFI
166b0 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c  G_SAMPLE, iSampl
166c0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
166d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
166e0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  c;.}.#endif /* i
166f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16700 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
16710 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  /../*.** Execute
16720 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
16730 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
16740 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
16750 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
16760 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
16770 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
16780 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
16790 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
167a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
167b0 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
167c0 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
167d0 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
167e0 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
167f0 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
16800 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
16810 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
16820 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
16830 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
16840 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
16850 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74  _exec(.  ShellSt
16860 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16890 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
168a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
168b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
168c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
168d0 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  L to be evaluate
168e0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
168f0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
16920 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
16930 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16940 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
16950 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
16960 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
16970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16980 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
16990 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
169a0 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
169b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
169c0 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
169d0 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
169e0 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20  cessed SQL */.  
169f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41  sqlite3 *db = pA
16a00 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  rg->db;..  if( p
16a10 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a  zErrMsg ){.    *
16a20 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b  pzErrMsg = NULL;
16a30 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16a40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16a50 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72  LTABLE.  if( pAr
16a60 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  g->expert.pExper
16a70 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78  t ){.    rc = ex
16a80 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41  pertHandleSQL(pA
16a90 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d  rg, zSql, pzErrM
16aa0 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
16ab0 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72  expertFinish(pAr
16ac0 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  g, (rc!=SQLITE_O
16ad0 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  K), pzErrMsg);. 
16ae0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
16af0 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28  le( zSql[0] && (
16b00 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29  SQLITE_OK == rc)
16b10 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
16b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74  onst char *zStmt
16b30 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Sql;.    rc = sq
16b40 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16b50 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
16b60 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
16b70 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
16b80 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
16b90 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
16ba0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
16bb0 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
16bc0 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
16bd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
16be0 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
16bf0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
16c00 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
16c10 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
16c20 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
16c30 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
16c40 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
16c50 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
16c60 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
16c70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
16c90 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
16ca0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
16cb0 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d     if( zStmtSql=
16cc0 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20  =0 ) zStmtSql = 
16cd0 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "";.      while(
16ce0 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71   IsSpace(zStmtSq
16cf0 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c  l[0]) ) zStmtSql
16d00 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61  ++;..      /* sa
16d10 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
16d20 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
16d30 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
16d40 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
16d50 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
16d60 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
16d70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
16d80 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
16d90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16da0 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
16db0 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
16dc0 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
16dd0 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48  ( pArg && ShellH
16de0 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46  asFlag(pArg, SHF
16df0 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20  LG_Echo) ){.    
16e00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
16e10 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  pArg->out, "%s\n
16e20 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53  ", zStmtSql ? zS
16e30 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a  tmtSql : zSql);.
16e40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16e50 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41  * Show the EXPLA
16e60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66  IN QUERY PLAN if
16e70 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20   .eqp is on */. 
16e80 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
16e90 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26   pArg->autoEQP &
16ea0 26 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69  & sqlite3_stmt_i
16eb0 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d  sexplain(pStmt)=
16ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
16ed0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
16ee0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
16ef0 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
16f00 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
16f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
16f20 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
16f30 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
16f40 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
16f50 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
16f60 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
16f70 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
16f80 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
16f90 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16fa0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
16fb0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
16fc0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
16fd0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
16fe0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
16ff0 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
17000 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
17010 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17020 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
17030 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
17040 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
17050 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
17060 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
17070 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
17080 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
170a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
170b0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
170c0 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
170d0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
170e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
170f0 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
17100 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
17110 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
17120 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
17130 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
17140 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17150 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
17160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17170 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
17180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17190 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
171a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
171b0 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
171c0 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
171d0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
171e0 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
171f0 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
17200 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
17210 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17220 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
17230 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
17240 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
17250 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
17260 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
17270 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
17280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
17290 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
172a0 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
172b0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
172c0 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
172d0 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
172e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
172f0 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
17300 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
17310 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
17320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
17330 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17340 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
17350 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
17360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17380 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
17390 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
173a0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
173b0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
173c0 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
173d0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
173e0 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
173f0 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
17400 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
17410 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
17420 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
17430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
17450 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
17460 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17470 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
17480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17490 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
174a0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
174b0 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
174c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
174d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
174e0 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
174f0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
17500 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
17510 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
17520 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
17530 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
17540 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
17550 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
17560 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
17570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
17580 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
17590 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
175a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
175b0 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
175c0 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
175d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
175e0 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
175f0 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
17600 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
17610 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
17620 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
17630 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
17640 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
17650 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
17660 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
17670 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70  stmt_isexplain(p
17680 53 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20  Stmt)==1 ){.    
17690 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
176a0 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
176b0 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  in;.          }.
176c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
176d0 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70  lite3_stmt_isexp
176e0 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29  lain(pStmt)==2 )
176f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41  {.            pA
17700 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45  rg->cMode = MODE
17710 5f 45 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20  _EQP;.          
17720 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
17730 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
17740 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c  hell is currentl
17750 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20  y in ".explain" 
17760 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65  mode, gather the
17770 20 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a   extra.        *
17780 2a 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  * data required 
17790 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74  to add indents t
177a0 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a  o the output.*/.
177b0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
177c0 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
177d0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
177e0 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
177f0 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53  prepare(pArg, pS
17800 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tmt);.        }.
17810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
17820 69 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  ind_prepared_stm
17830 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  t(pArg, pStmt);.
17840 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
17850 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
17860 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70  Stmt);.      exp
17870 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
17880 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71  (pArg);.      eq
17890 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
178a0 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
178b0 75 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73  usage stats if s
178c0 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20  tats on */.     
178d0 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
178e0 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  g->statsOn ){.  
178f0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
17900 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29  ats(db, pArg, 0)
17910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17920 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63   /* print loop-c
17930 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69  ounters if requi
17940 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
17950 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
17960 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  canstatsOn ){.  
17970 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63        display_sc
17980 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67  anstats(db, pArg
17990 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
179a0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
179b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74  e statement just
179c0 20 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68   executed. If th
179d0 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61  is fails, save a
179e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
179f0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
17a00 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
17a10 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e  set zSql to poin
17a20 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17a30 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  * next statement
17a40 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
17a50 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
17a60 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17a70 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
17a80 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
17a90 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
17aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
17ac0 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
17ad0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
17ae0 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
17af0 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
17b00 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
17b10 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
17b20 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
17b30 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
17b40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
17b50 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
17b60 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
17b70 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
17b80 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
17b90 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
17ba0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
17bb0 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
17bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17bd0 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
17be0 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
17bf0 61 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c  ated by tableCol
17c00 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  umnList()..*/.st
17c10 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f  atic void freeCo
17c20 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a  lumnList(char **
17c30 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  azCol){.  int i;
17c40 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f  .  for(i=1; azCo
17c50 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
17c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17c70 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ol[i]);.  }.  /*
17c80 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73   azCol[0] is a s
17c90 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a  tatic string */.
17ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17cb0 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zCol);.}../*.** 
17cc0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
17cd0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72   pointers to str
17ce0 69 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74  ings which are t
17cf0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a  he names of all.
17d00 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  ** columns in ta
17d10 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20  ble zTab.   The 
17d20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  memory to hold t
17d30 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61  he names is dyna
17d40 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
17d50 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65  ated and must be
17d60 20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65   released by the
17d70 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20   caller using a 
17d80 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
17d90 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e  ** to freeColumn
17da0 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  List()..**.** Th
17db0 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79  e azCol[0] entry
17dc0 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c   is usually NULL
17dd0 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a  .  However, if z
17de0 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  Tab contains a r
17df0 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68  owid.** value th
17e00 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
17e10 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61  reserved, then a
17e20 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65  zCol[0] is fille
17e30 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a  d in with the.**
17e40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77   name of the row
17e50 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  id column..**.**
17e60 20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c   The first regul
17e70 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ar column in the
17e80 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b   table is azCol[
17e90 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  1].  The list is
17ea0 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62   terminated.** b
17eb0 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  y an entry with 
17ec0 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a  azCol[i]==0..*/.
17ed0 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61  static char **ta
17ee0 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68  bleColumnList(Sh
17ef0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
17f00 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
17f10 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
17f20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17f30 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
17f40 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e  r *zSql;.  int n
17f50 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Col = 0;.  int n
17f60 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74  Alloc = 0;.  int
17f70 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20   nPK = 0;       
17f80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49  /* Number of PRI
17f90 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
17fa0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
17fb0 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  sIPK = 0;     /*
17fc0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49   True if one PRI
17fd0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
17fe0 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  of type INTEGER 
17ff0 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76  */.  int preserv
18000 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61  eRowid = ShellHa
18010 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  sFlag(p, SHFLG_P
18020 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20  reserveRowid);. 
18030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c   int rc;..  zSql
18040 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18050 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
18060 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29  _info=%Q", zTab)
18070 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18080 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
18090 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
180a0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
180b0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
180c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
180d0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
180e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
180f0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18100 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41      if( nCol>=nA
18110 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20  lloc-2 ){.      
18120 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a  nAlloc = nAlloc*
18130 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20  2 + nCol + 10;. 
18140 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c       azCol = sql
18150 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43  ite3_realloc(azC
18160 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ol, nAlloc*sizeo
18170 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  f(azCol[0]));.  
18180 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
18190 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
181a0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
181b0 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c      azCol[++nCol
181c0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
181d0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
181e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
181f0 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
18200 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
18210 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29  _int(pStmt, 5) )
18220 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20  {.      nPK++;. 
18230 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a       if( nPK==1.
18240 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
18250 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74  3_stricmp((const
18260 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
18270 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
18280 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,2),.           
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
182a0 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
182b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
182c0 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
182d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
182e0 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
182f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18300 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
18310 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f  tmt);.  if( azCo
18320 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
18330 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b  .  azCol[0] = 0;
18340 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d  .  azCol[nCol+1]
18350 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 0;..  /* The 
18360 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74  decision of whet
18370 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77  her or not a row
18380 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20  id really needs 
18390 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a  to be preserved.
183a0 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20    ** is tricky. 
183b0 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74   We never need t
183c0 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77  o preserve a row
183d0 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  id for a WITHOUT
183e0 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a   ROWID table.  *
183f0 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  * or a table wit
18400 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  h an INTEGER PRI
18410 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72  MARY KEY.  We ar
18420 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73  e unable to pres
18430 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73  erve.  ** rowids
18440 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
18450 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
18460 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75  accessible becau
18470 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  se there are oth
18480 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  er.  ** columns 
18490 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  in the table nam
184a0 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f  ed "rowid", "_ro
184b0 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22  wid_", and "oid"
184c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
184d0 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73  serveRowid && is
184e0 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  IPK ){.    /* If
184f0 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52   a single PRIMAR
18500 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74  Y KEY column wit
18510 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77  h type INTEGER w
18520 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74  as seen, then it
18530 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
18540 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68   an alise for th
18550 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74  e ROWID.  But it
18560 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
18570 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
18580 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61     ** table or a
18590 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
185a0 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e   KEY DESC column
185b0 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69  , neither of whi
185c0 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f  ch are.    ** RO
185d0 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f  WID aliases.  To
185e0 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
185f0 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20  se cases, check 
18600 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
18610 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22   there is a "pk"
18620 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d   entry in "PRAGM
18630 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20  A index_list".  
18640 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20  There will be.  
18650 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64    ** no "pk" ind
18660 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ex if the PRIMAR
18670 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20  Y KEY really is 
18680 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
18690 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20   ROWID..    */. 
186a0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
186b0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
186c0 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  T 1 FROM pragma_
186d0 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a  index_list(%Q)".
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
18700 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c  RE origin='pk'",
18710 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d   zTab);.    rc =
18720 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18730 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
18740 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18760 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
18770 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65   rc ){.      fre
18780 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
18790 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
187a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63   0;.    }.    rc
187b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
187c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
187d0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
187e0 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76  mt);.    preserv
187f0 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
18800 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
18810 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
18820 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
18830 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
18840 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
18850 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
18860 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
18870 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
18880 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
18890 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
188a0 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
188b0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
188c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
188d0 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
188e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
188f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18900 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
18910 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
18920 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
18930 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18940 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
18950 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
18960 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
18970 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
18980 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
18990 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
189a0 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
189b0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
189c0 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
189d0 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
189e0 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
189f0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
18a00 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
18a10 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
18a20 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
18a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
18a40 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
18a50 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
18a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18a70 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
18a80 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
18a90 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
18aa0 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
18ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18ac0 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
18ad0 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
18ae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
18b10 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67  l;.}../*.** Togg
18b20 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75  le the reverse_u
18b30 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
18b40 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   setting..*/.sta
18b50 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53  tic void toggleS
18b60 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74  electOrder(sqlit
18b70 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
18b80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18b90 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69   0;.  int iSetti
18ba0 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ng = 0;.  char z
18bb0 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  Stmt[100];.  sql
18bc0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
18bd0 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65  db, "PRAGMA reve
18be0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
18bf0 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74  lects", -1, &pSt
18c00 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  mt, 0);.  if( sq
18c10 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18c20 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18c30 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20  .    iSetting = 
18c40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18c50 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
18c60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
18c70 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73  lize(pStmt);.  s
18c80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
18c90 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a  sizeof(zStmt), z
18ca0 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52  Stmt,.       "PR
18cb0 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
18cc0 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25  rdered_selects(%
18cd0 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b  d)", !iSetting);
18ce0 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
18cf0 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c  db, zStmt, 0, 0,
18d00 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
18d10 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
18d20 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
18d30 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
18d40 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
18d50 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
18d60 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
18d70 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
18d80 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
18d90 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
18da0 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
18db0 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
18dc0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
18dd0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
18de0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
18df0 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
18e00 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
18e10 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
18e20 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
18e30 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
18e40 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
18e50 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
18e60 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69  *azNotUsed){.  i
18e70 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
18e80 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
18e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
18ea0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18eb0 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61  zSql;.  ShellSta
18ec0 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
18ed0 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55  ate *)pArg;..  U
18ee0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18ef0 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  azNotUsed);.  if
18f00 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41  ( nArg!=3 || azA
18f10 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
18f20 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41  ;.  zTable = azA
18f30 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d  rg[0];.  zType =
18f40 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71   azArg[1];.  zSq
18f50 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20  l = azArg[2];.. 
18f60 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
18f70 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
18f80 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
18f90 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
18fa0 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
18fb0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
18fc0 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
18fd0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
18fe0 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
18ff0 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
19000 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
19010 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
19020 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
19030 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
19040 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c   strncmp(zTable,
19050 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
19060 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19070 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
19080 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52  trncmp(zSql, "CR
19090 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
190a0 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20  LE", 20)==0 ){. 
190b0 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20     char *zIns;. 
190c0 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61     if( !p->writa
190d0 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
190e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
190f0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
19100 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
19110 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
19120 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
19130 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
19140 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
19150 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
19160 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
19170 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
19180 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
19190 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
191a0 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
191b0 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
191c0 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
191d0 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
191e0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
191f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
19200 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
19210 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
19220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
19240 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
19250 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e  >out, zSql, ";\n
19260 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ");.  }..  if( s
19270 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
19280 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
19290 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
192a0 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  t;.    ShellText
192b0 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   sTable;.    cha
192c0 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69  r **azCol;.    i
192d0 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a  nt i;.    char *
192e0 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
192f0 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64      int savedMod
19300 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20  e;..    azCol = 
19310 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
19320 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  p, zTable);.    
19330 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
19340 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b        p->nErr++;
19350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
19370 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20  lways quote the 
19380 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e  table name, even
19390 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
193a0 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c  o be pure ascii,
193b0 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
193c0 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e  it is a keyword.
193d0 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54   Ex:  INSERT INT
193e0 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f  O "table" ... */
193f0 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
19400 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65  Table);.    appe
19410 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
19420 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
19430 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  r(zTable));.    
19440 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67  /* If preserving
19450 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20   the rowid, add 
19460 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66  a column list af
19470 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ter the table na
19480 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74  me..    ** In ot
19490 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53  her words:  "INS
194a0 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77  ERT INTO tab(row
194b0 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41  id,a,b,c,...) VA
194c0 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a  LUES(...)".    *
194d0 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
194e0 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49   usual "INSERT I
194f0 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e  NTO tab VALUES(.
19500 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19510 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19520 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19530 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20  t(&sTable, "(", 
19540 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
19550 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
19560 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
19570 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
19580 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
19590 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
195a0 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
195b0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
195c0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
195d0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
195e0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
195f0 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
19600 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29  Text(&sTable, ")
19610 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ", 0);.    }..  
19620 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70    /* Build an ap
19630 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54  propriate SELECT
19640 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
19650 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c    initText(&sSel
19660 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ect);.    append
19670 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
19680 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
19690 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
196a0 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
196b0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
196c0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
196d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
196e0 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
196f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31     }.    for(i=1
19700 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
19710 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
19720 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
19730 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
19740 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
19750 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31     if( azCol[i+1
19760 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
19770 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
19780 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
19790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
197a0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
197b0 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
197c0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46  xt(&sSelect, " F
197d0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61  ROM ", 0);.    a
197e0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
197f0 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  ct, zTable, quot
19800 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
19810 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61  .    savedDestTa
19820 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61  ble = p->zDestTa
19830 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f  ble;.    savedMo
19840 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
19850 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
19860 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20  = sTable.z;.    
19870 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f  p->mode = p->cMo
19880 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
19890 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  ;.    rc = shell
198a0 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74  _exec(p, sSelect
198b0 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  .z, 0);.    if( 
198c0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
198d0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
198e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
198f0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19900 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19910 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19920 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
19930 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
19940 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
19950 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b  , sSelect.z, 0);
19960 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
19970 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
19980 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44  .    }.    p->zD
19990 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64  estTable = saved
199a0 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70  DestTable;.    p
199b0 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f  ->mode = savedMo
199c0 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  de;.    freeText
199d0 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66  (&sTable);.    f
199e0 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74  reeText(&sSelect
199f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
19a00 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  p->nErr++;.  }. 
19a10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19a20 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20  .** Run zQuery. 
19a30 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61   Use dump_callba
19a40 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
19a50 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20  back routine so 
19a60 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  that.** the cont
19a70 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72  ents of the quer
19a80 79 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20  y are output as 
19a90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
19aa0 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  **.** If we get 
19ab0 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
19ac0 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
19ad0 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
19ae0 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
19af0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
19b00 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
19b10 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
19b20 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
19b30 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
19b40 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
19b50 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74  *zQuery.){.  int
19b60 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
19b70 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  r = 0;.  rc = sq
19b80 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19b90 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63  , zQuery, dump_c
19ba0 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
19bb0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
19bc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
19bd0 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20      char *zQ2;. 
19be0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
19bf0 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20  len30(zQuery);. 
19c00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
19c10 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19c20 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19c30 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19c40 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
19c50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19c60 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19c70 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
19c80 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  zErr);.      sql
19c90 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
19ca0 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b  .      zErr = 0;
19cb0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d  .    }.    zQ2 =
19cc0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30   malloc( len+100
19cd0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d   );.    if( zQ2=
19ce0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
19cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
19d00 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51  intf(len+100, zQ
19d10 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20  2, "%s ORDER BY 
19d20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75  rowid DESC", zQu
19d30 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ery);.    rc = s
19d40 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19d50 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c  b, zQ2, dump_cal
19d60 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19d70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
19d80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
19d90 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
19da0 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a  ** ERROR: %s ***
19db0 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
19dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19de0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
19df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
19e00 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32  r);.    free(zQ2
19e10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19e20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  rc;.}../*.** Tex
19e30 74 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67  t of help messag
19e40 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65  es..**.** The he
19e50 6c 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68  lp text for each
19e60 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d   individual comm
19e70 61 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20  and begins with 
19e80 61 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72  a line that star
19e90 74 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20  ts.** with ".". 
19ea0 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65   Subsequent line
19eb0 73 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74  s are suppliment
19ec0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19ed0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
19ee0 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   be two or more 
19ef0 73 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74  spaces between t
19f00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f  he end of the co
19f10 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a  mmand and the.**
19f20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   start of the de
19f30 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61  scription of wha
19f40 74 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64  t that command d
19f50 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  oes..*/.static c
19f60 6f 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65  onst char *(azHe
19f70 6c 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65  lp[]) = {.#if de
19f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
19f90 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
19fa0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19fb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
19fc0 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
19fd0 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
19fe0 20 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a   SQL archives",.
19ff0 20 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61    "   Each comma
1a000 6e 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  nd must have exa
1a010 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
1a020 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e  following option
1a030 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c  s:",.  "     -c,
1a040 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20   --create       
1a050 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61          Create a
1a060 20 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20   new archive",. 
1a070 20 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64   "     -u, --upd
1a080 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
1a090 20 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75    Add files or u
1a0a0 70 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68  pdate files with
1a0b0 20 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c   changed mtime",
1a0c0 0a 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69  .  "     -i, --i
1a0d0 6e 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20  nsert           
1a0e0 20 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20      Like -u but 
1a0f0 61 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20  always add even 
1a100 69 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67  if mtime unchang
1a110 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c  ed",.  "     -t,
1a120 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20   --list         
1a130 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e          List con
1a140 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65  tents of archive
1a150 22 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d  ",.  "     -x, -
1a160 2d 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20  -extract        
1a170 20 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69        Extract fi
1a180 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65  les from archive
1a190 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61  ",.  "   Optiona
1a1a0 6c 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20  l arguments:",. 
1a1b0 20 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72   "     -v, --ver
1a1c0 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  bose            
1a1d0 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c    Print each fil
1a1e0 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70  ename as it is p
1a1f0 72 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20  rocessed",.  "  
1a200 20 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69     -f FILE, --fi
1a210 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70  le FILE       Op
1a220 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65  erate on archive
1a230 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69   FILE (default i
1a240 73 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a  s current db)",.
1a250 20 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c    "     -a FILE,
1a260 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20   --append FILE  
1a270 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49     Operate on FI
1a280 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  LE opened using 
1a290 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22  the apndvfs VFS"
1a2a0 2c 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52  ,.  "     -C DIR
1a2b0 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49  , --directory DI
1a2c0 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64  R    Change to d
1a2d0 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20  irectory DIR to 
1a2e0 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c  read/extract fil
1a2f0 65 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c  es",.  "     -n,
1a300 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20   --dryrun       
1a310 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
1a320 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20   SQL that would 
1a330 68 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a  have occurred",.
1a340 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22    "   Examples:"
1a350 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63  ,.  "     .ar -c
1a360 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
1a370 6f 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20  o bar  # Create 
1a380 61 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d  archive.sar from
1a390 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62   files foo and b
1a3a0 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72  ar",.  "     .ar
1a3b0 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72   -tf archive.sar
1a3c0 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
1a3d0 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
1a3e0 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20  ive.sar",.  "   
1a3f0 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69    .ar -xvf archi
1a400 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23  ve.sar         #
1a410 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61   Verbosely extra
1a420 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
1a430 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20  chive.sar",.  " 
1a440 20 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20    See also:",.  
1a450 22 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71  "      http://sq
1a460 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d  lite.org/cli.htm
1a470 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f  l#sqlar_archive_
1a480 73 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66  support",.#endif
1a490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a4a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a4b0 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f  ON.  ".auth ON|O
1a4c0 46 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53  FF             S
1a4d0 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63  how authorizer c
1a4e0 61 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69  allbacks",.#endi
1a4f0 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  f.  ".backup ?DB
1a500 3f 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61  ? FILE        Ba
1a510 63 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74  ckup DB (default
1a520 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49   \"main\") to FI
1a530 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  LE",.  "       -
1a540 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20  -append         
1a550 20 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e     Use the appen
1a560 64 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20  dvfs",.  "      
1a570 20 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20   --async        
1a580 20 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49       Write to FI
1a590 4c 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75  LE without a jou
1a5a0 72 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74  rnal and without
1a5b0 20 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62   fsync()",.  ".b
1a5c0 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
1a5d0 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65         Stop afte
1a5e0 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72  r hitting an err
1a5f0 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  or.  Default OFF
1a600 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  ",.  ".binary on
1a610 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54  |off           T
1a620 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75  urn binary outpu
1a630 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65  t on or off.  De
1a640 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e  fault OFF",.  ".
1a650 63 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20  cd DIRECTORY    
1a660 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74          Change t
1a670 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  he working direc
1a680 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52  tory to DIRECTOR
1a690 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20  Y",.  ".changes 
1a6a0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1a6b0 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72  Show number of r
1a6c0 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53  ows changed by S
1a6d0 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47  QL",.  ".check G
1a6e0 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20  LOB             
1a6f0 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20   Fail if output 
1a700 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20  since .testcase 
1a710 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c  does not match",
1a720 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42  .  ".clone NEWDB
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1a740 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57  ne data into NEW
1a750 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73  DB from the exis
1a760 74 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  ting database",.
1a770 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20    ".databases   
1a780 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1a790 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73   names and files
1a7a0 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
1a7b0 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63  abases",.  ".dbc
1a7c0 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f  onfig ?op? ?val?
1a7d0 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61       List or cha
1a7e0 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  nge sqlite3_db_c
1a7f0 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22  onfig() options"
1a800 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ,.  ".dbinfo ?DB
1a810 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  ?             Sh
1a820 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  ow status inform
1a830 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1a840 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64  database",.  ".d
1a850 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
1a860 20 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c         Render al
1a870 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  l database conte
1a880 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20  nt as SQL",.  " 
1a890 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1a8a0 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d       --preserve-
1a8b0 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c  rowids      Incl
1a8c0 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73  ude ROWID values
1a8d0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c   in the output",
1a8e0 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69  .  "     --newli
1a8f0 6e 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  nes             
1a900 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20  Allow unescaped 
1a910 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65  newline characte
1a920 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20  rs in output",. 
1a930 20 22 20 20 20 54 41 42 4c 45 20 69 73 20 61 20   "   TABLE is a 
1a940 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72  LIKE pattern for
1a950 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64   the tables to d
1a960 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f  ump",.  ".echo o
1a970 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
1a980 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
1a990 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  cho on or off",.
1a9a0 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
1a9b0 75 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62  ull|...     Enab
1a9c0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75  le or disable au
1a9d0 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
1a9e0 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22  QUERY PLAN",.  "
1a9f0 20 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22     Other Modes:"
1aa00 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1aa10 44 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74  DEBUG.  "      t
1aa20 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1aa30 20 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58       Show raw EX
1aa40 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1aa50 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20   output",.  "   
1aa60 20 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20     trace        
1aa70 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22           Like \"
1aa80 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20  full\" but also 
1aa90 65 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20  enable \"PRAGMA 
1aaa0 76 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23  vdbe_trace\"",.#
1aab0 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74  endif.  "      t
1aac0 72 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20  rigger          
1aad0 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c       Like \"full
1aae0 5c 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77  \" but also show
1aaf0 20 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64   trigger bytecod
1ab00 65 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20  e",.  ".excel   
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70  Display the outp
1ab30 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61  ut of next comma
1ab40 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  nd in a spreadsh
1ab50 65 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f  eet",.  ".exit ?
1ab60 43 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20  CODE?           
1ab70 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
1ab80 72 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d  ram with return-
1ab90 63 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e  code CODE",.  ".
1aba0 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20  expert          
1abb0 20 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45          EXPERIME
1abc0 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e  NTAL. Suggest in
1abd0 64 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66  dexes for specif
1abe0 69 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a  ied queries",./*
1abf0 20 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e   Because explain
1ac00 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61   mode comes on a
1ac10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77  utomatically now
1ac20 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  , the ".explain"
1ac30 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f   mode.** is remo
1ac40 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c  ved from the hel
1ac50 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73  p screen.  It is
1ac60 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64   still supported
1ac70 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77   for legacy, how
1ac80 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c  ever */./*".expl
1ac90 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f  ain ?on|off|auto
1aca0 3f 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e  ?   Turn EXPLAIN
1acb0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20   output mode on 
1acc0 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74  or off or to aut
1acd0 6f 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66  omatic",*/.  ".f
1ace0 69 6c 65 63 74 72 6c 20 43 4d 44 20 2e 2e 2e 20  ilectrl CMD ... 
1acf0 20 20 20 20 20 20 20 52 75 6e 20 76 61 72 69 6f         Run vario
1ad00 75 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  us sqlite3_file_
1ad10 63 6f 6e 74 72 6f 6c 28 29 20 6f 70 65 72 61 74  control() operat
1ad20 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 20 20 20  ions",.  "      
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 20 20 20 20 52 75 6e 20 5c 22 2e 66 69 6c 65       Run \".file
1ad50 63 74 72 6c 5c 22 20 77 69 74 68 20 6e 6f 20 61  ctrl\" with no a
1ad60 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 64 65 74  rguments for det
1ad70 61 69 6c 73 22 2c 0a 20 20 22 2e 66 75 6c 6c 73  ails",.  ".fulls
1ad80 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
1ad90 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61     Show schema a
1ada0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
1adb0 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61  f sqlite_stat ta
1adc0 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65  bles",.  ".heade
1add0 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
1ade0 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
1adf0 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
1ae00 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20   off",.  ".help 
1ae10 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f  ?-all? ?PATTERN?
1ae20 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78     Show help tex
1ae30 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a  t for PATTERN",.
1ae40 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20    ".import FILE 
1ae50 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f  TABLE       Impo
1ae60 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
1ae70 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23  E into TABLE",.#
1ae80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ae90 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a  IT_TEST_CONTROL.
1aea0 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44    ".imposter IND
1aeb0 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65 61  EX TABLE    Crea
1aec0 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
1aed0 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78  e TABLE on index
1aee0 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a   INDEX",.#endif.
1aef0 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
1af00 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77  LE?         Show
1af10 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65   names of indexe
1af20 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  s",.  "         
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af40 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73 70    If TABLE is sp
1af50 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
1af60 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c  ow indexes for",
1af70 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1af90 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54  ables matching T
1afa0 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c  ABLE using the L
1afb0 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a  IKE operator.",.
1afc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1afd0 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22  ABLE_IOTRACE.  "
1afe0 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20  .iotrace FILE   
1aff0 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
1b000 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
1b010 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c  ogging to FILE",
1b020 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69  .#endif.  ".limi
1b030 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20  t ?LIMIT? ?VAL? 
1b040 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63      Display or c
1b050 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1b060 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
1b070 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50  IT",.  ".lint OP
1b080 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20  TIONS           
1b090 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61   Report potentia
1b0a0 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e  l schema issues.
1b0b0 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f  ",.  "     Optio
1b0c0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
1b0d0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20   fkey-indexes   
1b0e0 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66    Find missing f
1b0f0 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78  oreign key index
1b100 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es",.#ifndef SQL
1b110 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1b120 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64  TENSION.  ".load
1b130 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20   FILE ?ENTRY?   
1b140 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
1b150 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a  nsion library",.
1b160 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
1b170 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
1b180 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
1b190 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
1b1a0 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
1b1b0 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65  tdout",.  ".mode
1b1c0 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
1b1d0 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
1b1e0 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45  ode",.  "   MODE
1b1f0 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20   is one of:",.  
1b200 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43  "     ascii    C
1b210 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69  olumns/rows deli
1b220 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e  mited by 0x1F an
1b230 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20  d 0x1E",.  "    
1b240 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
1b250 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1b260 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d  ",.  "     colum
1b270 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64  n   Left-aligned
1b280 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20   columns.  (See 
1b290 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20  .width)",.  "   
1b2a0 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
1b2b0 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20  <table> code",. 
1b2c0 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20 20   "     insert   
1b2d0 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65  SQL insert state
1b2e0 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22  ments for TABLE"
1b2f0 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20  ,.  "     line  
1b300 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
1b310 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20   line",.  "     
1b320 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
1b330 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
1b340 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f  \"",.  "     quo
1b350 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e 73  te    Escape ans
1b360 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22  wers as for SQL"
1b370 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20 20  ,.  "     tabs  
1b380 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
1b390 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20   values",.  "   
1b3a0 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
1b3b0 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20  ist elements",. 
1b3c0 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
1b3d0 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20 53  ING        Use S
1b3e0 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
1b3f0 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a  f NULL values",.
1b400 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c    ".once (-e|-x|
1b410 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70  FILE)       Outp
1b420 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ut for the next 
1b430 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79  SQL command only
1b440 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
1b450 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1b460 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1b470 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c  open as a pipe",
1b480 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f  .  "     Other o
1b490 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1b4a0 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65      -e    Invoke
1b4b0 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69   system text edi
1b4c0 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20  tor",.  "       
1b4d0 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20  -x    Open in a 
1b4e0 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1b4f0 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
1b500 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20   ?FILE?   Close 
1b510 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
1b520 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c  e and reopen FIL
1b530 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  E",.  "     Opti
1b540 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1b550 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20    --append      
1b560 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20    Use appendvfs 
1b570 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62 61  to append databa
1b580 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
1b590 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66 20 53   FILE",.#ifdef S
1b5a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
1b5b0 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ERIALIZE.  "    
1b5c0 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a      --deserializ
1b5d0 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65  e   Load into me
1b5e0 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c 69  mory useing sqli
1b5f0 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
1b600 29 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  )",.  "        -
1b610 2d 68 65 78 64 62 20 20 20 20 20 20 20 20 20 4c  -hexdb         L
1b620 6f 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f  oad the output o
1b630 66 20 5c 22 64 62 74 6f 74 78 74 5c 22 20 61 73  f \"dbtotxt\" as
1b640 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1b650 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20  tabase",.  "    
1b660 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65 20 4e 20      --maxsize N 
1b670 20 20 20 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65      Maximum size
1b680 20 66 6f 72 20 2d 2d 68 65 78 64 62 20 6f 72 20   for --hexdb or 
1b690 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 64 20 64  --deserialized d
1b6a0 61 74 61 62 61 73 65 22 2c 0a 23 65 6e 64 69 66  atabase",.#endif
1b6b0 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6e 65  .  "        --ne
1b6c0 77 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74  w           Init
1b6d0 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20 61  ialize FILE to a
1b6e0 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  n empty database
1b6f0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1b700 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 4f 70  readonly      Op
1b710 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79  en FILE readonly
1b720 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1b730 7a 69 70 20 20 20 20 20 20 20 20 20 20 20 46 49  zip           FI
1b740 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  LE is a ZIP arch
1b750 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74  ive",.  ".output
1b760 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20   ?FILE?         
1b770 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1b780 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75 74 20   FILE or stdout 
1b790 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69 74 74  if FILE is omitt
1b7a0 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20  ed",.  "     If 
1b7b0 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68  FILE begins with
1b7c0 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 69   '|' then open i
1b7d0 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c 0a 20  t as a pipe.",. 
1b7e0 20 22 2e 70 61 72 61 6d 65 74 65 72 20 43 4d 44   ".parameter CMD
1b7f0 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61 6e 61 67   ...       Manag
1b800 65 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20  e SQL parameter 
1b810 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20  bindings",.  "  
1b820 20 63 6c 65 61 72 20 20 20 20 20 20 20 20 20 20   clear          
1b830 20 20 20 20 20 20 20 20 20 45 72 61 73 65 20 61           Erase a
1b840 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  ll bindings",.  
1b850 22 20 20 20 69 6e 69 74 20 20 20 20 20 20 20 20  "   init        
1b860 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74              Init
1b870 69 61 6c 69 7a 65 20 74 68 65 20 54 45 4d 50 20  ialize the TEMP 
1b880 74 61 62 6c 65 20 74 68 61 74 20 68 6f 6c 64 73  table that holds
1b890 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20   bindings",.  " 
1b8a0 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20    list          
1b8b0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 74            List t
1b8c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 61 6d  he current param
1b8d0 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a  eter bindings",.
1b8e0 20 20 22 20 20 20 73 65 74 20 50 41 52 41 4d 45    "   set PARAME
1b8f0 54 45 52 20 56 41 4c 55 45 20 20 20 20 20 47 69  TER VALUE     Gi
1b900 76 65 6e 20 53 51 4c 20 70 61 72 61 6d 65 74 65  ven SQL paramete
1b910 72 20 50 41 52 41 4d 45 54 45 52 20 61 20 76 61  r PARAMETER a va
1b920 6c 75 65 20 6f 66 20 56 41 4c 55 45 22 2c 0a 20  lue of VALUE",. 
1b930 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 52               PAR
1b950 41 4d 45 54 45 52 20 73 68 6f 75 6c 64 20 73 74  AMETER should st
1b960 61 72 74 20 77 69 74 68 20 27 24 27 2c 20 27 3a  art with '$', ':
1b970 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f 27 22 2c  ', '@', or '?'",
1b980 0a 20 20 22 20 20 20 75 6e 73 65 74 20 50 41 52  .  "   unset PAR
1b990 41 4d 45 54 45 52 20 20 20 20 20 20 20 20 20 52  AMETER         R
1b9a0 65 6d 6f 76 65 20 50 41 52 41 4d 45 54 45 52 20  emove PARAMETER 
1b9b0 66 72 6f 6d 20 74 68 65 20 62 69 6e 64 69 6e 67  from the binding
1b9c0 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e 70 72 69   table",.  ".pri
1b9d0 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
1b9e0 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72       Print liter
1b9f0 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23 69 66 6e  al STRING",.#ifn
1ba00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ba10 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
1ba20 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73 73 20 4e  K.  ".progress N
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1ba40 76 6f 6b 65 20 70 72 6f 67 72 65 73 73 20 68 61  voke progress ha
1ba50 6e 64 6c 65 72 20 61 66 74 65 72 20 65 76 65 72  ndler after ever
1ba60 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c 0a 20 20  y N opcodes",.  
1ba70 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e 20 20 20  "   --limit N   
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1ba90 74 65 72 72 75 70 74 20 61 66 74 65 72 20 4e 20  terrupt after N 
1baa0 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1bab0 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6f 6e 63  ks",.  "   --onc
1bac0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1bad0 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20       Do no more 
1bae0 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67 72 65 73  than one progres
1baf0 73 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20  s interrupt",.  
1bb00 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d 71 20 20  "   --quiet|-q  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
1bb20 20 6f 75 74 70 75 74 20 65 78 63 65 70 74 20 61   output except a
1bb30 74 20 69 6e 74 65 72 72 75 70 74 73 22 2c 0a 20  t interrupts",. 
1bb40 20 22 20 20 20 2d 2d 72 65 73 65 74 20 20 20 20   "   --reset    
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1bb60 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 66  eset the count f
1bb70 6f 72 20 65 61 63 68 20 69 6e 70 75 74 20 61 6e  or each input an
1bb80 64 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 23 65  d interrupt",.#e
1bb90 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d 70 74 20  ndif.  ".prompt 
1bba0 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20  MAIN CONTINUE   
1bbb0 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
1bbc0 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a  ndard prompts",.
1bbd0 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1bbf0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a   this program",.
1bc00 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20    ".read FILE   
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61 64              Read
1bc20 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45   input from FILE
1bc30 22 2c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ",.#if !defined(
1bc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1bc50 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
1bc60 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1bc70 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a  LE_DBPAGE_VTAB).
1bc80 20 20 22 2e 72 65 63 6f 76 65 72 20 20 20 20 20    ".recover     
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 52 65 63 6f              Reco
1bca0 76 65 72 20 61 73 20 6d 75 63 68 20 64 61 74 61  ver as much data
1bcb0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
1bcc0 6d 20 63 6f 72 72 75 70 74 20 64 62 2e 22 2c 0a  m corrupt db.",.
1bcd0 23 65 6e 64 69 66 0a 20 20 22 2e 72 65 73 74 6f  #endif.  ".resto
1bce0 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
1bcf0 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
1bd00 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
1bd10 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
1bd20 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65   FILE",.  ".save
1bd30 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1bd40 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d      Write in-mem
1bd50 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74  ory database int
1bd60 6f 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61  o FILE",.  ".sca
1bd70 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20  nstats on|off   
1bd80 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65       Turn sqlite
1bd90 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
1bda0 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f  s() metrics on o
1bdb0 72 20 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65  r off",.  ".sche
1bdc0 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  ma ?PATTERN?    
1bdd0 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45      Show the CRE
1bde0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ATE statements m
1bdf0 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22  atching PATTERN"
1be00 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1be10 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1be20 20 2d 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20   --indent       
1be30 20 20 20 20 20 54 72 79 20 74 6f 20 70 72 65 74       Try to pret
1be40 74 79 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68  ty-print the sch
1be50 65 6d 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65  ema",.  ".selfte
1be60 73 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  st ?OPTIONS?    
1be70 20 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69    Run tests defi
1be80 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54  ned in the SELFT
1be90 45 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20  EST table",.  " 
1bea0 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1beb0 22 20 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20  "       --init  
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
1bed0 61 74 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45  ate a new SELFTE
1bee0 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  ST table",.  "  
1bef0 20 20 20 20 20 2d 76 20 20 20 20 20 20 20 20 20       -v         
1bf00 20 20 20 20 20 20 20 20 20 20 56 65 72 62 6f 73            Verbos
1bf10 65 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73  e output",.  ".s
1bf20 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f  eparator COL ?RO
1bf30 57 3f 20 20 20 20 20 43 68 61 6e 67 65 20 74 68  W?     Change th
1bf40 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77  e column and row
1bf50 20 73 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69   separators",.#i
1bf60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1bf70 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1bf80 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41  .  ".session ?NA
1bf90 4d 45 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65  ME? CMD ...  Cre
1bfa0 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73  ate or control s
1bfb0 65 73 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20  essions",.  "   
1bfc0 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20  Subcommands:",. 
1bfd0 20 22 20 20 20 20 20 61 74 74 61 63 68 20 54 41   "     attach TA
1bfe0 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  BLE             
1bff0 41 74 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20  Attach TABLE",. 
1c000 20 22 20 20 20 20 20 63 68 61 6e 67 65 73 65 74   "     changeset
1c010 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1c020 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
1c030 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20  t into FILE",.  
1c040 22 20 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20  "     close     
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1c060 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e  lose one session
1c070 22 2c 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c  ",.  "     enabl
1c080 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  e ?BOOLEAN?     
1c090 20 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79      Set or query
1c0a0 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22   the enable bit"
1c0b0 2c 0a 20 20 22 20 20 20 20 20 66 69 6c 74 65 72  ,.  "     filter
1c0c0 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20   GLOB...        
1c0d0 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73     Reject tables
1c0e0 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22   matching GLOBs"
1c0f0 2c 0a 20 20 22 20 20 20 20 20 69 6e 64 69 72 65  ,.  "     indire
1c100 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20  ct ?BOOLEAN?    
1c110 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79     Mark or query
1c120 20 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74   the indirect st
1c130 61 74 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69  atus",.  "     i
1c140 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20  sempty          
1c150 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68          Query wh
1c160 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f  ether the sessio
1c170 6e 20 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22  n is empty",.  "
1c180 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 20 20       list       
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1c1a0 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  st currently ope
1c1b0 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22  n session names"
1c1c0 2c 0a 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44  ,.  "     open D
1c1d0 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  B NAME          
1c1e0 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65     Open a new se
1c1f0 73 73 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20  ssion on DB",.  
1c200 22 20 20 20 20 20 70 61 74 63 68 73 65 74 20 46  "     patchset F
1c210 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57  ILE            W
1c220 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20  rite a patchset 
1c230 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1c240 20 20 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f    If ?NAME? is o
1c250 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73  mitted, the firs
1c260 74 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f  t defined sessio
1c270 6e 20 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e  n is used.",.#en
1c280 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20  dif.  ".sha3sum 
1c290 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1c2a0 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68  Compute a SHA3 h
1c2b0 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  ash of database 
1c2c0 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20  content",.  "   
1c2d0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1c2e0 20 20 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20       --schema   
1c2f0 20 20 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20             Also 
1c300 68 61 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f  hash the sqlite_
1c310 6d 61 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20  master table",. 
1c320 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32   "      --sha3-2
1c330 32 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73  24            Us
1c340 65 20 74 68 65 20 73 68 61 33 2d 32 32 34 20 61  e the sha3-224 a
1c350 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20  lgorithm",.  "  
1c360 20 20 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20      --sha3-256  
1c370 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1c380 65 20 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72  e sha3-256 algor
1c390 69 74 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74  ithm.  This is t
1c3a0 68 65 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20  he default.",.  
1c3b0 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38  "      --sha3-38
1c3c0 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  4            Use
1c3d0 20 74 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c   the sha3-384 al
1c3e0 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1c3f0 20 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20     --sha3-512   
1c400 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1c410 20 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69   sha3-512 algori
1c420 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79  thm",.  "    Any
1c430 20 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20   other argument 
1c440 69 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72  is a LIKE patter
1c450 6e 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  n for tables to 
1c460 68 61 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53  hash",.#ifndef S
1c470 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1c480 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d  TEM.  ".shell CM
1c490 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20  D ARGS...       
1c4a0 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1c4b0 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1c4c0 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73  l",.#endif.  ".s
1c4d0 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  how             
1c4e0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1c4f0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1c500 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
1c510 6e 67 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20  ngs",.  ".stats 
1c520 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20  ?on|off?        
1c530 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20    Show stats or 
1c540 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72  turn stats 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 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1c570 54 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43  TEM.  ".system C
1c580 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20  MD ARGS...      
1c590 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1c5a0 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1c5b0 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74  l",.#endif.  ".t
1c5c0 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  ables ?TABLE?   
1c5d0 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
1c5e0 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63  s of tables matc
1c5f0 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
1c600 6e 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65  n TABLE",.  ".te
1c610 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20  stcase NAME     
1c620 20 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69        Begin redi
1c630 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74  recting output t
1c640 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  o 'testcase-out.
1c650 74 78 74 27 22 2c 0a 20 20 22 2e 74 65 73 74 63  txt'",.  ".testc
1c660 74 72 6c 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20  trl CMD ...     
1c670 20 20 20 52 75 6e 20 76 61 72 69 6f 75 73 20 73     Run various s
1c680 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c690 72 6f 6c 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  rol() operations
1c6a0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  ",.  "          
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 52 75 6e 20 5c 22 2e 74 65 73 74 63 74 72 6c   Run \".testctrl
1c6d0 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  \" with no argum
1c6e0 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73  ents for details
1c6f0 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d  ",.  ".timeout M
1c700 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  S              T
1c710 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
1c720 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
1c730 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20  milliseconds",. 
1c740 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
1c750 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1c760 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20  SQL timer on or 
1c770 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  off",.#ifndef SQ
1c780 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
1c790 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54 49 4f    ".trace ?OPTIO
1c7a0 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75 74 70  NS?         Outp
1c7b0 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
1c7c0 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
1c7d0 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49 4c 45  un",.  "    FILE
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1c800 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1c810 20 73 74 64 6f 75 74 20 20 20 20 20 20 20 20 20   stdout         
1c820 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1c830 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74 22 2c  tput to stdout",
1c840 0a 20 20 22 20 20 20 20 73 74 64 65 72 72 20 20  .  "    stderr  
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 73  Send output to s
1c870 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20 20 6f  tderr",.  "    o
1c880 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
1c890 20 20 20 20 20 20 20 44 69 73 61 62 6c 65 20 74         Disable t
1c8a0 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20 20 20  racing",.  "    
1c8b0 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20 20 20  --expanded      
1c8c0 20 20 20 20 20 20 20 20 45 78 70 61 6e 64 20 71          Expand q
1c8d0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 22  uery parameters"
1c8e0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1c8f0 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
1c900 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d 61 6c  .  "    --normal
1c910 69 7a 65 64 20 20 20 20 20 20 20 20 20 20 20 20  ized            
1c920 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c 20 73  Normal the SQL s
1c930 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65 6e 64  tatements",.#end
1c940 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c 61 69  if.  "    --plai
1c950 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1c960 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20 69 74    Show SQL as it
1c970 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20 22 20   is input",.  " 
1c980 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20 20 20     --stmt       
1c990 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1c9a0 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75   statement execu
1c9b0 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54 52 41  tion (SQLITE_TRA
1c9c0 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22 20 20  CE_STMT)",.  "  
1c9d0 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20 20 20    --profile     
1c9e0 20 20 20 20 20 20 20 20 20 20 50 72 6f 66 69 6c            Profil
1c9f0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28 53 51  e statements (SQ
1ca00 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49  LITE_TRACE_PROFI
1ca10 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 72  LE)",.  "    --r
1ca20 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
1ca30 20 20 20 20 20 54 72 61 63 65 20 65 61 63 68 20       Trace each 
1ca40 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52 41 43  row (SQLITE_TRAC
1ca50 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20 20 20  E_ROW)",.  "    
1ca60 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20  --close         
1ca70 20 20 20 20 20 20 20 20 54 72 61 63 65 20 63 6f          Trace co
1ca80 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 20 28  nnection close (
1ca90 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
1caa0 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f 2a 20  SE)",.#endif /* 
1cab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1cac0 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e 66 6f  E */.  ".vfsinfo
1cad0 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 20   ?AUX?          
1cae0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1caf0 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ut the top-level
1cb00 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69   VFS",.  ".vfsli
1cb10 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1cb20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
1cb30 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a 20 20  lable VFSes",.  
1cb40 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20  ".vfsname ?AUX? 
1cb50 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1cb60 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1cb70 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e  VFS stack",.  ".
1cb80 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
1cb90 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75  ...     Set colu
1cba0 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
1cbb0 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a  column\" mode",.
1cbc0 20 20 22 20 20 20 20 20 4e 65 67 61 74 69 76 65    "     Negative
1cbd0 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
1cbe0 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  stify",.};../*.*
1cbf0 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20 74 65  * Output help te
1cc00 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65  xt..**.** zPatte
1cc10 72 6e 20 64 65 73 63 72 69 62 65 73 20 74 68 65  rn describes the
1cc20 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73   set of commands
1cc30 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c 70 20   for which help 
1cc40 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65 64  text is provided
1cc50 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65 72 6e  ..** If zPattern
1cc60 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73   is NULL, then s
1cc70 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  how all commands
1cc80 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76 65 20  , but only give 
1cc90 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65  a one-line.** de
1cca0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63  scription of eac
1ccb0 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  h..**.** Return 
1ccc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
1ccd0 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
1cce0 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28 46 49   int showHelp(FI
1ccf0 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
1cd00 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a  har *zPattern){.
1cd10 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1cd20 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt j = 0;.  int 
1cd30 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
1cd40 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  Pat;.  if( zPatt
1cd50 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61  ern==0.   || zPa
1cd60 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20  ttern[0]=='0'.  
1cd70 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74   || strcmp(zPatt
1cd80 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20  ern,"-a")==0.   
1cd90 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65  || strcmp(zPatte
1cda0 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20  rn,"-all")==0.  
1cdb0 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77 20 61  ){.    /* Show a
1cdc0 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74  ll commands, but
1cdd0 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70   only one line p
1cde0 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  er command */.  
1cdf0 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
1ce00 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d 20 22  0 ) zPattern = "
1ce10 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1ce20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1ce30 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1ce40 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1ce50 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65  ]=='.' || zPatte
1ce60 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  rn[0] ){.       
1ce70 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1ce80 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1ce90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b  [i]);.        n+
1cea0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ceb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1cec0 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e   Look for comman
1ced0 64 73 20 74 68 61 74 20 66 6f 72 20 77 68 69 63  ds that for whic
1cee0 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 6e  h zPattern is an
1cef0 20 65 78 61 63 74 20 70 72 65 66 69 78 20 2a 2f   exact prefix */
1cf00 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69  .    zPat = sqli
1cf10 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73  te3_mprintf(".%s
1cf20 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  *", zPattern);. 
1cf30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1cf40 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1cf50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1cf60 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1cf70 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d  (zPat, azHelp[i]
1cf80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cf90 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1cfa0 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1cfb0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  i]);.        j =
1cfc0 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b   i+1;.        n+
1cfd0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1cfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1cff0 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69 66 28  e(zPat);.    if(
1d000 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   n ){.      if( 
1d010 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
1d020 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65 72 6e  /* when zPattern
1d030 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1d040 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
1d050 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64  and, then includ
1d060 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
1d070 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 61 74   details of that
1d080 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20   command, which 
1d090 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61 74 20  should begin at 
1d0a0 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20  offset j */.    
1d0b0 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72      while( j<Arr
1d0c0 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31  aySize(azHelp)-1
1d0d0 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d   && azHelp[j][0]
1d0e0 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  !='.' ){.       
1d0f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1d100 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1d110 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[j]);.        
1d120 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    j++;.        }
1d130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1d140 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20  eturn n;.    }. 
1d150 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63     /* Look for c
1d160 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63 6f 6e  ommands that con
1d170 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e  tain zPattern an
1d180 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20 74 68  ywhere.  Show th
1d190 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  e complete.    *
1d1a0 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f  * text of all co
1d1b0 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61 74 63  mmands that matc
1d1c0 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d  h. */.    zPat =
1d1d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1d1e0 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61 74 74  ("%%%s%%", zPatt
1d1f0 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ern);.    for(i=
1d200 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1d210 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  zHelp); i++){.  
1d220 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69      if( azHelp[i
1d230 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20  ][0]=='.' ) j = 
1d240 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  i;.      if( sql
1d250 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61  ite3_strlike(zPa
1d260 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29  t, azHelp[i], 0)
1d270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
1d280 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1d290 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1d2a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ]);.        whil
1d2b0 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  e( j<ArraySize(a
1d2c0 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65  zHelp)-1 && azHe
1d2d0 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20  lp[j+1][0]!='.' 
1d2e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  ){.          j++
1d2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  ;.          utf8
1d300 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1d310 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1d320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d330 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20     i = j;.      
1d340 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1d350 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d360 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d  _free(zPat);.  }
1d370 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1d380 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1d390 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
1d3a0 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74  nt process_input
1d3b0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 3b  (ShellState *p);
1d3c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1d3d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65   content of file
1d3e0 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f   zName into memo
1d3f0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1d400 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1d410 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  4().** and retur
1d420 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1d430 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63  he buffer. The c
1d440 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1d450 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
1d460 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a  .** the memory..
1d470 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1d480 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74  er pnByte is not
1d490 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29   NULL, (*pnByte)
1d4a0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1d4b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
1d4c0 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  * read..**.** Fo
1d4d0 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61  r convenience, a
1d4e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
1d4f0 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61  byte is always a
1d500 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
1d510 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d  ata read.** from
1d520 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
1d530 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72   the buffer is r
1d540 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79  eturned. This by
1d550 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
1d560 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e  ed in.** the fin
1d570 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e  al value of (*pn
1d580 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63  Byte), if applic
1d590 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c  able..**.** NULL
1d5a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1d5b0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
1d5c0 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69  ountered. The fi
1d5d0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e  nal value of *pn
1d5e0 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66  Byte.** is undef
1d5f0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
1d600 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
1d610 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73  r *readFile(cons
1d620 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1d630 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46  nt *pnByte){.  F
1d640 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
1d650 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
1d660 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65  long nIn;.  size
1d670 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72  _t nRead;.  char
1d680 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e   *pBuf;.  if( in
1d690 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1d6a0 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
1d6b0 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20  EEK_END);.  nIn 
1d6c0 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
1d6d0 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75  ewind(in);.  pBu
1d6e0 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
1d6f0 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20  oc64( nIn+1 );. 
1d700 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 20   if( pBuf==0 ){ 
1d710 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74 75  fclose(in); retu
1d720 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20  rn 0; }.  nRead 
1d730 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49  = fread(pBuf, nI
1d740 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c  n, 1, in);.  fcl
1d750 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e  ose(in);.  if( n
1d760 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73  Read!=1 ){.    s
1d770 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75 66  qlite3_free(pBuf
1d780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1d790 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d  .  }.  pBuf[nIn]
1d7a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79   = 0;.  if( pnBy
1d7b0 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
1d7c0 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75  In;.  return pBu
1d7d0 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  f;.}..#if define
1d7e0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1d7f0 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43  SESSION)./*.** C
1d800 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70  lose a single Op
1d810 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  enSession object
1d820 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1d830 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61 74   of its associat
1d840 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e  ed.** resources.
1d850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d860 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70  session_close(Op
1d870 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
1d880 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ion){.  int i;. 
1d890 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
1d8a0 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d  delete(pSession-
1d8b0 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  >p);.  sqlite3_f
1d8c0 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e  ree(pSession->zN
1d8d0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ame);.  for(i=0;
1d8e0 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69   i<pSession->nFi
1d8f0 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lter; i++){.    
1d900 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
1d910 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1d920 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
1d930 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1d940 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d  ->azFilter);.  m
1d950 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20  emset(pSession, 
1d960 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65  0, sizeof(OpenSe
1d970 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69  ssion));.}.#endi
1d980 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  f../*.** Close a
1d990 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f  ll OpenSession o
1d9a0 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61  bjects and relea
1d9b0 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  se all associate
1d9c0 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  d resources..*/.
1d9d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d9e0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1d9f0 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  N).static void s
1da00 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
1da10 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1da20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1da30 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69  i=0; i<p->nSessi
1da40 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65  on; i++){.    se
1da50 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e  ssion_close(&p->
1da60 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20  aSession[i]);.  
1da70 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  }.  p->nSession 
1da80 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  = 0;.}.#else.# d
1da90 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c  efine session_cl
1daa0 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69  ose_all(X).#endi
1dab0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  f../*.** Impleme
1dac0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
1dad0 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20  Filter function 
1dae0 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73  for an open sess
1daf0 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e  ion.  Omit.** an
1db00 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62  y tables named b
1db10 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74  y ".session filt
1db20 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20  er" but let all 
1db30 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f  other table thro
1db40 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ugh..*/.#if defi
1db50 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1db60 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
1db70 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69  c int session_fi
1db80 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c  lter(void *pCtx,
1db90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1dba0 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f  b){.  OpenSessio
1dbb0 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f  n *pSession = (O
1dbc0 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78  penSession*)pCtx
1dbd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1dbe0 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e  (i=0; i<pSession
1dbf0 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b  ->nFilter; i++){
1dc00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1dc10 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f  _strglob(pSessio
1dc20 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20  n->azFilter[i], 
1dc30 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72  zTab)==0 ) retur
1dc40 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1dc50 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
1dc60 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75  *.** Try to dedu
1dc70 63 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 66  ce the type of f
1dc80 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61  ile for zName ba
1dc90 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65  sed on its conte
1dca0 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f  nt.  Return.** o
1dcb0 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f  ne of the SHELL_
1dcc0 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  OPEN_* constants
1dcd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1dce0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1dcf0 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62  st or is empty b
1dd00 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b  ut its name look
1dd10 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20  s like a ZIP.** 
1dd20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68 65 20  archive and the 
1dd30 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20  dfltZip flag is 
1dd40 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  true, then assum
1dd50 65 20 69 74 20 69 73 20 61 20 5a 49 50 20 61 72  e it is a ZIP ar
1dd60 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77  chive..** Otherw
1dd70 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f  ise, assume an o
1dd80 72 64 69 6e 61 72 79 20 64 61 74 61 62 61 73 65  rdinary database
1dd90 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
1dda0 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a  he filename if.*
1ddb0 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f  * the type canno
1ddc0 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
1ddd0 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f  from content..*/
1dde0 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74 61 62  .int deduceDatab
1ddf0 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68  aseType(const ch
1de00 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64  ar *zName, int d
1de10 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20  fltZip){.  FILE 
1de20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65  *f = fopen(zName
1de30 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f  , "rb");.  size_
1de40 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t n;.  int rc = 
1de50 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1de60 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  C;.  char zBuf[1
1de70 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  00];.  if( f==0 
1de80 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a  ){.    if( dfltZ
1de90 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ip && sqlite3_st
1dea0 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e  rlike("%.zip",zN
1deb0 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
1dec0 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1ded0 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1dee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1def0 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1df00 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d  EN_NORMAL;.    }
1df10 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64  .  }.  n = fread
1df20 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20 66 29  (zBuf, 16, 1, f)
1df30 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20  ;.  if( n==1 && 
1df40 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 51  memcmp(zBuf, "SQ
1df50 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20  Lite format 3", 
1df60 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63  16)==0 ){.    fc
1df70 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72 65 74  lose(f);.    ret
1df80 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  urn SHELL_OPEN_N
1df90 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65  ORMAL;.  }.  fse
1dfa0 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f  ek(f, -25, SEEK_
1dfb0 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61  END);.  n = frea
1dfc0 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66  d(zBuf, 25, 1, f
1dfd0 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  );.  if( n==1 &&
1dfe0 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53   memcmp(zBuf, "S
1dff0 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d  tart-Of-SQLite3-
1e000 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
1e010 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
1e020 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65  _APPENDVFS;.  }e
1e030 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66  lse{.    fseek(f
1e040 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29  , -22, SEEK_END)
1e050 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
1e060 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b  zBuf, 22, 1, f);
1e070 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
1e080 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26   zBuf[0]==0x50 &
1e090 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20  & zBuf[1]==0x4b 
1e0a0 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35  && zBuf[2]==0x05
1e0b0 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b  .       && zBuf[
1e0c0 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20  3]==0x06 ){.    
1e0d0 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1e0e0 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
1e0f0 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26  else if( n==0 &&
1e100 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69   dfltZip && sqli
1e110 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a  te3_strlike("%.z
1e120 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20  ip",zName,0)==0 
1e130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48  ){.      rc = SH
1e140 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1e150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  ;.    }.  }.  fc
1e160 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72  lose(f);.  retur
1e170 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66 64 65  n rc;  .}..#ifde
1e180 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e190 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a 0a 2a  DESERIALIZE./*.*
1e1a0 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20 61 6e  * Reconstruct an
1e1b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e1c0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 6f 75  ase using the ou
1e1d0 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 22 64  tput from the "d
1e1e0 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f 67 72  btotxt".** progr
1e1f0 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74 65 6e  am.  Read conten
1e200 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  t from the file 
1e210 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  in p->zDbFilenam
1e220 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46 69 6c  e.  If p->zDbFil
1e230 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c 20 74  ename.** is 0, t
1e240 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74  hen read from st
1e250 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f  andard input..*/
1e260 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
1e270 20 63 68 61 72 20 2a 72 65 61 64 48 65 78 44 62   char *readHexDb
1e280 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1e290 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a 20 20  int *pnData){.  
1e2a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1e2b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e   = 0;.  int nLin
1e2c0 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  e;.  int n = 0;.
1e2d0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b 0a    int pgsz = 0;.
1e2e0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1e2f0 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  0;.  int j, k;. 
1e300 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20   int rc;.  FILE 
1e310 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *in;.  unsigned 
1e320 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20 63 68 61  int x[16];.  cha
1e330 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a 20  r zLine[1000];. 
1e340 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e   if( p->zDbFilen
1e350 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20 3d 20  ame ){.    in = 
1e360 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65  fopen(p->zDbFile
1e370 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20 20 20  name, "r");.    
1e380 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
1e390 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e3a0 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f  tderr, "cannot o
1e3b0 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 72  pen \"%s\" for r
1e3c0 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e 7a 44  eading\n", p->zD
1e3d0 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  bFilename);.    
1e3e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1e3f0 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 30 3b  }.    nLine = 0;
1e400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1e410 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20 6e 4c   = p->in;.    nL
1e420 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e 6f 3b  ine = p->lineno;
1e430 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
1e440 20 69 6e 20 3d 20 73 74 64 69 6e 3b 0a 20 20 7d   in = stdin;.  }
1e450 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a  .  *pnData = 0;.
1e460 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 69 66 28    nLine++;.  if(
1e470 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69   fgets(zLine, si
1e480 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29  zeof(zLine), in)
1e490 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48  ==0 ) goto readH
1e4a0 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 72 63  exDb_error;.  rc
1e4b0 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c   = sscanf(zLine,
1e4c0 20 22 7c 20 73 69 7a 65 20 25 64 20 70 61 67 65   "| size %d page
1e4d0 73 69 7a 65 20 25 64 22 2c 20 26 6e 2c 20 26 70  size %d", &n, &p
1e4e0 67 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gsz);.  if( rc!=
1e4f0 32 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78  2 ) goto readHex
1e500 44 62 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  Db_error;.  if( 
1e510 6e 3c 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48  n<0 ) goto readH
1e520 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 61 20  exDb_error;.  a 
1e530 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e540 28 20 6e 20 3f 20 6e 20 3a 20 31 20 29 3b 0a 20  ( n ? n : 1 );. 
1e550 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1e560 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e570 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d  err, "Out of mem
1e580 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  ory!\n");.    go
1e590 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e5a0 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  or;.  }.  memset
1e5b0 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28  (a, 0, n);.  if(
1e5c0 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
1e5d0 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a  z>65536 || (pgsz
1e5e0 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20   & (pgsz-1))!=0 
1e5f0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1e600 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61  tf(stderr, "inva
1e610 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29  lid pagesize\n")
1e620 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e630 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e640 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66    for(nLine++; f
1e650 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1e660 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d  of(zLine), in)!=
1e670 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20  0; nLine++){.   
1e680 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1e690 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f  ne, "| page %d o
1e6a0 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26  ffset %d", &j, &
1e6b0 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  k);.    if( rc==
1e6c0 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73  2 ){.      iOffs
1e6d0 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f  et = k;.      co
1e6e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e6f0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c    if( strncmp(zL
1e700 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36  ine, "| end ", 6
1e710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  )==0 ){.      br
1e720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1e730 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
1e740 2c 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78  ,"| %d: %x %x %x
1e750 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e760 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e770 78 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20  x %x %x",.      
1e780 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78            &j, &x
1e790 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32  [0], &x[1], &x[2
1e7a0 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c  ], &x[3], &x[4],
1e7b0 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26   &x[5], &x[6], &
1e7c0 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  x[7],.          
1e7d0 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b        &x[8], &x[
1e7e0 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31  9], &x[10], &x[1
1e7f0 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31  1], &x[12], &x[1
1e800 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31  3], &x[14], &x[1
1e810 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  5]);.    if( rc=
1e820 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d  =17 ){.      k =
1e830 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20   iOffset+j;.    
1e840 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b    if( k+16<=n ){
1e850 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
1e860 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1e870 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20  0; ii<16; ii++) 
1e880 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26  a[k+ii] = x[ii]&
1e890 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0xff;.      }.  
1e8a0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74    }.  }.  *pnDat
1e8b0 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21  a = n;.  if( in!
1e8c0 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63  =p->in ){.    fc
1e8d0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73  lose(in);.  }els
1e8e0 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f  e{.    p->lineno
1e8f0 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1e900 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48  return a;..readH
1e910 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66  exDb_error:.  if
1e920 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20  ( in!=p->in ){. 
1e930 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1e940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1e950 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  e( fgets(zLine, 
1e960 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70  sizeof(zLine), p
1e970 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  ->in)!=0 ){.    
1e980 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
1e990 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e   if(strncmp(zLin
1e9a0 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
1e9b0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1e9c0 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  }.    p->lineno 
1e9d0 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73  = nLine;.  }.  s
1e9e0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1e9f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1ea00 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c  derr,"Error on l
1ea10 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64  ine %d of --hexd
1ea20 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e  b input\n", nLin
1ea30 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  e);.  return 0;.
1ea40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ea50 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1ea60 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALIZE */../*.** 
1ea70 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  Scalar function 
1ea80 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2e 20 54  "shell_int32". T
1ea90 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1eaa0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1eab0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 20  on.** must be a 
1eac0 62 6c 6f 62 2e 20 54 68 65 20 73 65 63 6f 6e 64  blob. The second
1ead0 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
1eae0 69 6e 74 65 67 65 72 2e 20 54 68 69 73 20 66 75  integer. This fu
1eaf0 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 61 64 73 20  nction.** reads 
1eb00 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 33 32  and returns a 32
1eb10 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
1eb20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 79 74  integer from byt
1eb30 65 0a 2a 2a 20 6f 66 66 73 65 74 20 28 34 2a 3c  e.** offset (4*<
1eb40 61 72 67 32 3e 29 20 6f 66 20 74 68 65 20 62 6c  arg2>) of the bl
1eb50 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ob..*/.static vo
1eb60 69 64 20 73 68 65 6c 6c 49 6e 74 33 32 28 0a 20  id shellInt32(. 
1eb70 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1eb80 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
1eb90 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74  t argc, .  sqlit
1eba0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1ebb0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1ebc0 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b  ned char *pBlob;
1ebd0 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20  .  int nBlob;.  
1ebe0 69 6e 74 20 69 49 6e 74 3b 0a 0a 20 20 55 4e 55  int iInt;..  UNU
1ebf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
1ec00 67 63 29 3b 0a 20 20 6e 42 6c 6f 62 20 3d 20 73  gc);.  nBlob = s
1ec10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1ec20 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70  es(argv[0]);.  p
1ec30 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Blob = (const un
1ec40 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73 71 6c  signed char*)sql
1ec50 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
1ec60 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49 6e 74  argv[0]);.  iInt
1ec70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1ec80 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  _int(argv[1]);..
1ec90 20 20 69 66 28 20 69 49 6e 74 3e 3d 30 20 26 26    if( iInt>=0 &&
1eca0 20 28 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e 42 6c   (iInt+1)*4<=nBl
1ecb0 6f 62 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ob ){.    const 
1ecc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1ecd0 20 3d 20 26 70 42 6c 6f 62 5b 69 49 6e 74 2a 34   = &pBlob[iInt*4
1ece0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ];.    sqlite3_i
1ecf0 6e 74 36 34 20 69 56 61 6c 20 3d 20 28 28 73 71  nt64 iVal = ((sq
1ed00 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 30 5d  lite3_int64)a[0]
1ed10 3c 3c 32 34 29 0a 20 20 20 20 20 20 20 20 20 20  <<24).          
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
1ed30 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61  (sqlite3_int64)a
1ed40 5b 31 5d 3c 3c 31 36 29 0a 20 20 20 20 20 20 20  [1]<<16).       
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  + ((sqlite3_int6
1ed70 34 29 61 5b 32 5d 3c 3c 20 38 29 0a 20 20 20 20  4)a[2]<< 8).    
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69     + ((sqlite3_i
1eda0 6e 74 36 34 29 61 5b 33 5d 3c 3c 20 30 29 3b 0a  nt64)a[3]<< 0);.
1edb0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1edc0 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
1edd0 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  , iVal);.  }.}..
1ede0 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e  /*.** Scalar fun
1edf0 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 65 73 63  ction "shell_esc
1ee00 61 70 65 5f 63 72 6e 6c 22 20 75 73 65 64 20 62  ape_crnl" used b
1ee10 79 20 74 68 65 20 2e 72 65 63 6f 76 65 72 20 63  y the .recover c
1ee20 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 54 68 65 20 61  ommand..** The a
1ee30 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1ee40 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1ee50 69 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  is the output of
1ee60 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 66 75 6e   built-in.** fun
1ee70 63 74 69 6f 6e 20 71 75 6f 74 65 28 29 2e 20 49  ction quote(). I
1ee80 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
1ee90 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
1eea0 75 74 20 69 73 20 22 27 22 2c 20 0a 2a 2a 20 69  ut is "'", .** i
1eeb0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
1eec0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
1eed0 74 6f 20 71 75 6f 74 65 28 29 20 77 61 73 20 61  to quote() was a
1eee0 20 74 65 78 74 20 76 61 6c 75 65 2c 0a 2a 2a 20   text value,.** 
1eef0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1ef00 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
1ef10 69 6e 70 75 74 20 66 6f 72 20 22 5c 6e 22 20 61  input for "\n" a
1ef20 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74 65  nd "\r" characte
1ef30 72 73 0a 2a 2a 20 61 6e 64 20 61 64 64 73 20 61  rs.** and adds a
1ef40 20 77 72 61 70 70 65 72 20 73 69 6d 69 6c 61 72   wrapper similar
1ef50 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1ef60 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 65 70 6c 61  g:.**.**   repla
1ef70 63 65 28 72 65 70 6c 61 63 65 28 3c 69 6e 70 75  ce(replace(<inpu
1ef80 74 3e 2c 20 27 5c 6e 27 2c 20 63 68 61 72 28 31  t>, '\n', char(1
1ef90 30 29 2c 20 27 5c 72 27 2c 20 63 68 61 72 28 31  0), '\r', char(1
1efa0 33 29 29 3b 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  3));.**.** Or, i
1efb0 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
1efc0 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70  acter of the inp
1efd0 75 74 20 69 73 20 6e 6f 74 20 22 27 22 2c 20 74  ut is not "'", t
1efe0 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  hen a copy.** of
1eff0 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 72 65   the input is re
1f000 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f010 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 73 63 61  c void shellEsca
1f020 70 65 43 72 6e 6c 28 0a 20 20 73 71 6c 69 74 65  peCrnl(.  sqlite
1f030 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1f040 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
1f050 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
1f060 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1f070 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
1f080 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1f090 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1f0a0 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 55 4e  t(argv[0]);.  UN
1f0b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
1f0c0 72 67 63 29 3b 0a 20 20 69 66 28 20 7a 54 65 78  rgc);.  if( zTex
1f0d0 74 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  t[0]=='\'' ){.  
1f0e0 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73 71    int nText = sq
1f0f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1f100 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
1f110 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
1f120 7a 42 75 66 31 5b 32 30 5d 3b 0a 20 20 20 20 63  zBuf1[20];.    c
1f130 68 61 72 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20  har zBuf2[20];. 
1f140 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f150 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
1f160 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
1f170 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
1f180 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20  ;.    int nNL = 
1f190 30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0;..    for(i=0;
1f1a0 20 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b   zText[i]; i++){
1f1b0 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c 3d 3d  .      if( zNL==
1f1c0 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27  0 && zText[i]=='
1f1d0 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  \n' ){.        z
1f1e0 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
1f1f0 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 6e 22 2c  ng(zText, "\\n",
1f200 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
1f210 3b 0a 20 20 20 20 20 20 20 20 6e 4e 4c 20 3d 20  ;.        nNL = 
1f220 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 4c 29  (int)strlen(zNL)
1f230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f240 69 66 28 20 7a 43 52 3d 3d 30 20 26 26 20 7a 54  if( zCR==0 && zT
1f250 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a  ext[i]=='\r' ){.
1f260 20 20 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e          zCR = un
1f270 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78  used_string(zTex
1f280 74 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  t, "\\r", "\\015
1f290 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 20  ", zBuf2);.     
1f2a0 20 20 20 6e 43 52 20 3d 20 28 69 6e 74 29 73 74     nCR = (int)st
1f2b0 72 6c 65 6e 28 7a 43 52 29 3b 0a 20 20 20 20 20  rlen(zCR);.     
1f2c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1f2d0 28 20 7a 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a  ( zNL || zCR ){.
1f2e0 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d        int iOut =
1f2f0 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 4d   0;.      i64 nM
1f300 61 78 20 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52 29  ax = (nNL > nCR)
1f310 20 3f 20 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20   ? nNL : nCR;.  
1f320 20 20 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20 3d      i64 nAlloc =
1f330 20 6e 4d 61 78 20 2a 20 6e 54 65 78 74 20 2b 20   nMax * nText + 
1f340 28 6e 4d 61 78 2b 36 34 29 2a 32 3b 0a 20 20 20  (nMax+64)*2;.   
1f350 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
1f360 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
1f370 61 6c 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b  alloc64(nAlloc);
1f380 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d  .      if( zOut=
1f390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1f3a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1f3b0 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
1f3c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f3d0 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  n;.      }..    
1f3e0 20 20 69 66 28 20 7a 4e 4c 20 26 26 20 7a 43 52    if( zNL && zCR
1f3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1f400 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f410 22 72 65 70 6c 61 63 65 28 72 65 70 6c 61 63 65  "replace(replace
1f420 28 22 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  (", 16);.       
1f430 20 69 4f 75 74 20 2b 3d 20 31 36 3b 0a 20 20 20   iOut += 16;.   
1f440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f450 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f460 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65 28 22  Out], "replace("
1f470 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  , 8);.        iO
1f480 75 74 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 7d  ut += 8;.      }
1f490 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1f4a0 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zText[i]; i++){.
1f4b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 65 78          if( zTex
1f4c0 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  t[i]=='\n' ){.  
1f4d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f4e0 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c  zOut[iOut], zNL,
1f4f0 20 6e 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 20   nNL);.         
1f500 20 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20   iOut += nNL;.  
1f510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f520 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29  zText[i]=='\r' )
1f530 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1f540 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f550 7a 43 52 2c 20 6e 43 52 29 3b 0a 20 20 20 20 20  zCR, nCR);.     
1f560 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 6e 43 52       iOut += nCR
1f570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f580 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b  .          zOut[
1f590 69 4f 75 74 5d 20 3d 20 7a 54 65 78 74 5b 69 5d  iOut] = zText[i]
1f5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75 74  ;.          iOut
1f5b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1f5c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1f5d0 20 7a 4e 4c 20 29 7b 0a 20 20 20 20 20 20 20 20   zNL ){.        
1f5e0 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f5f0 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b 20 69 4f  t], ",'", 2); iO
1f600 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ut += 2;.       
1f610 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1f620 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20  ut], zNL, nNL); 
1f630 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20  iOut += nNL;.   
1f640 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75       memcpy(&zOu
1f650 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20 63 68 61  t[iOut], "', cha
1f660 72 28 31 30 29 29 22 2c 20 31 32 29 3b 20 69 4f  r(10))", 12); iO
1f670 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20 20 20 20  ut += 12;.      
1f680 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52 20  }.      if( zCR 
1f690 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1f6a0 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22  y(&zOut[iOut], "
1f6b0 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d  ,'", 2); iOut +=
1f6c0 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   2;.        memc
1f6d0 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f6e0 7a 43 52 2c 20 6e 43 52 29 3b 20 69 4f 75 74 20  zCR, nCR); iOut 
1f6f0 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20 20 20  += nCR;.        
1f700 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f710 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31 33 29  t], "', char(13)
1f720 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d  )", 12); iOut +=
1f730 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   12;.      }..  
1f740 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1f750 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1f760 20 7a 4f 75 74 2c 20 69 4f 75 74 2c 20 53 51 4c   zOut, iOut, SQL
1f770 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1f780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1f790 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
1f7a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
1f7b0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
1f7c0 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
1f7d0 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a  t, argv[0]);.}..
1f7e0 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f 70 65  /* Flags for ope
1f7f0 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  n_db()..**.** Th
1f800 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
1f810 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20  or of open_db() 
1f820 69 73 20 74 6f 20 65 78 69 74 28 31 29 20 69 66  is to exit(1) if
1f830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61   the database fa
1f840 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20  ils to.** open. 
1f850 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45   The OPEN_DB_KEE
1f860 50 41 4c 49 56 45 20 66 6c 61 67 20 63 68 61 6e  PALIVE flag chan
1f870 67 65 73 20 74 68 61 74 20 73 6f 20 74 68 61 74  ges that so that
1f880 20 69 74 20 70 72 69 6e 74 73 20 61 6e 20 65 72   it prints an er
1f890 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c  ror.** but still
1f8a0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
1f8b0 20 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a   calling exit..*
1f8c0 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42  *.** The OPEN_DB
1f8d0 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67 20 63 61  _ZIPFILE flag ca
1f8e0 75 73 65 73 20 6f 70 65 6e 5f 64 62 28 29 20 74  uses open_db() t
1f8f0 6f 20 70 72 65 66 65 72 20 74 6f 20 6f 70 65 6e  o prefer to open
1f900 20 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a   files as a.** Z
1f910 49 50 20 61 72 63 68 69 76 65 20 69 66 20 74 68  IP archive if th
1f920 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1f930 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74  exist or is empt
1f940 79 20 61 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d  y and its name m
1f950 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e  atches.** the *.
1f960 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a  zip pattern..*/.
1f970 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f  #define OPEN_DB_
1f980 4b 45 45 50 41 4c 49 56 45 20 20 20 30 78 30 30  KEEPALIVE   0x00
1f990 31 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 66  1   /* Return af
1f9a0 74 65 72 20 65 72 72 6f 72 20 69 66 20 74 72 75  ter error if tru
1f9b0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45  e */.#define OPE
1f9c0 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20 20 20  N_DB_ZIPFILE    
1f9d0 20 30 78 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e   0x002   /* Open
1f9e0 20 61 73 20 5a 49 50 20 69 66 20 6e 61 6d 65 20   as ZIP if name 
1f9f0 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f  matches *.zip */
1fa00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1fa10 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
1fa20 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69  s open.  If it i
1fa30 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e  s not, then open
1fa40 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
1fa50 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
1fa60 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e  o open, print an
1fa70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1fa80 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74  nd exit..*/.stat
1fa90 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28  ic void open_db(
1faa0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
1fab0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20  nt openFlags){. 
1fac0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
1fad0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1fae0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1faf0 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20 20 20 20  _UNSPEC ){.     
1fb00 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e   if( p->zDbFilen
1fb10 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62  ame==0 || p->zDb
1fb20 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
1fb30 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
1fb40 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
1fb50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  EN_NORMAL;.     
1fb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fb70 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75  p->openMode = (u
1fb80 38 29 64 65 64 75 63 65 44 61 74 61 62 61 73 65  8)deduceDatabase
1fb90 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  Type(p->zDbFilen
1fba0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20     (openFlags & 
1fbd0 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29  OPEN_DB_ZIPFILE)
1fbe0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
1fbf0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
1fc00 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20  p->openMode ){. 
1fc10 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1fc20 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20  OPEN_APPENDVFS: 
1fc30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fc40 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62  3_open_v2(p->zDb
1fc50 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1fc60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  , .           SQ
1fc70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1fc80 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1fc90 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73  CREATE, "apndvfs
1fca0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
1fcb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1fcc0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1fcd0 5f 48 45 58 44 42 3a 0a 20 20 20 20 20 20 63 61  _HEXDB:.      ca
1fce0 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  se SHELL_OPEN_DE
1fcf0 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20  SERIALIZE: {.   
1fd00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1fd10 6e 28 30 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  n(0, &p->db);.  
1fd20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fd30 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1fd40 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1fd50 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LE: {.        sq
1fd60 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d  lite3_open(":mem
1fd70 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a  ory:", &p->db);.
1fd80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fd90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1fda0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41  e SHELL_OPEN_REA
1fdb0 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20  DONLY: {.       
1fdc0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1fdd0 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1fde0 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f   &p->db, SQLITE_
1fdf0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30  OPEN_READONLY, 0
1fe00 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1fe10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fe20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1fe30 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61  UNSPEC:.      ca
1fe40 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f  se SHELL_OPEN_NO
1fe50 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  RMAL: {.        
1fe60 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
1fe70 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
1fe80 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1fe90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fea0 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20   }.    globalDb 
1feb0 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
1fec0 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c   p->db==0 || SQL
1fed0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
1fee0 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
1fef0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1ff00 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
1ff10 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  r: unable to ope
1ff20 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c  n database \"%s\
1ff30 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ": %s\n",.      
1ff40 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
1ff50 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  me, sqlite3_errm
1ff60 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
1ff70 20 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20    if( openFlags 
1ff80 26 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  & OPEN_DB_KEEPAL
1ff90 49 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  IVE ){.        s
1ffa0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
1ffb0 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b  mory:", &p->db);
1ffc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
1ffd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
1ffe0 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69  xit(1);.    }.#i
1fff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20000 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
20010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
20020 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
20030 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65  on(p->db, 1);.#e
20040 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
20050 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e  _fileio_init(p->
20060 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
20070 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f  qlite3_shathree_
20080 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
20090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
200a0 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70  ompletion_init(p
200b0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66  ->db, 0, 0);.#if
200c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
200d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
200e0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
200f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
20100 41 47 45 5f 56 54 41 42 29 0a 20 20 20 20 73 71  AGE_VTAB).    sq
20110 6c 69 74 65 33 5f 64 62 64 61 74 61 5f 69 6e 69  lite3_dbdata_ini
20120 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
20130 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
20140 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
20150 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69     sqlite3_zipfi
20160 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  le_init(p->db, 0
20170 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20180 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e  3_sqlar_init(p->
20190 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
201a0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
201b0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
201c0 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f  >db, "shell_add_
201d0 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49  schema", 3, SQLI
201e0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64          shellAdd
20210 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30  SchemaName, 0, 0
20220 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20230 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20240 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64  ->db, "shell_mod
20250 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20  ule_schema", 1, 
20260 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
20290 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30  lModuleSchema, 0
202a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
202b0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
202c0 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
202d0 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
202e0 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20  TE_UTF8, p,.    
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
20310 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  sFunc, 0, 0);.  
20320 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20330 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20340 20 22 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63   "shell_escape_c
20350 72 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  rnl", 1, SQLITE_
20360 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 73 68 65 6c 6c 45 73 63 61 70 65       shellEscape
20390 43 72 6e 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Crnl, 0, 0);.   
203a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
203b0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
203c0 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2c 20 32  "shell_int32", 2
203d0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
203e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
20400 65 6c 6c 49 6e 74 33 32 2c 20 30 2c 20 30 29 3b  ellInt32, 0, 0);
20410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20420 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
20430 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20440 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20450 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51 4c 49   "edit", 1, SQLI
20460 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63          editFunc
20490 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
204a0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
204b0 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69  tion(p->db, "edi
204c0 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  t", 2, SQLITE_UT
204d0 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20     editFunc, 0, 
20500 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
20510 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  f( p->openMode==
20520 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
20530 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  LE ){.      char
20540 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
20550 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
20560 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54 55     "CREATE VIRTU
20570 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55 53 49  AL TABLE zip USI
20580 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 3b 22  NG zipfile(%Q);"
20590 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  , p->zDbFilename
205a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
205b0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
205c0 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
205d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
205e0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66  zSql);.    }.#if
205f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20600 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20  E_DESERIALIZE.  
20610 20 20 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70    else.    if( p
20620 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
20630 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49  L_OPEN_DESERIALI
20640 5a 45 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64  ZE || p->openMod
20650 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  e==SHELL_OPEN_HE
20660 58 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  XDB ){.      int
20670 20 72 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   rc;.      int n
20680 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  Data = 0;.      
20690 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
206a0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66 28 20  Data;.      if( 
206b0 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
206c0 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
206d0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  IZE ){.        a
206e0 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
206f0 20 63 68 61 72 2a 29 72 65 61 64 46 69 6c 65 28   char*)readFile(
20700 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
20710 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  &nData);.      }
20720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 44  else{.        aD
20730 61 74 61 20 3d 20 72 65 61 64 48 65 78 44 62 28  ata = readHexDb(
20740 70 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  p, &nData);.    
20750 20 20 20 20 69 66 28 20 61 44 61 74 61 3d 3d 30      if( aData==0
20760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
20770 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
20780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
20790 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72   = sqlite3_deser
207a0 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22 6d  ialize(p->db, "m
207b0 61 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44 61  ain", aData, nDa
207c0 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20 20  ta, nData,.     
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
207e0 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  LITE_DESERIALIZE
207f0 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20 20  _RESIZEABLE |.  
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
20820 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 29  IZE_FREEONCLOSE)
20830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
20840 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
20850 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
20860 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64 65  rror: sqlite3_de
20870 73 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74 75  serialize() retu
20880 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  rns %d\n", rc);.
20890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
208a0 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20 29 7b 0a  ( p->szMax>0 ){.
208b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
208c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
208d0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
208e0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 4c 49  TE_FCNTL_SIZE_LI
208f0 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61 78 29 3b  MIT, &p->szMax);
20900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
20910 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
20920 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c  ** Attempt to cl
20930 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 65 73  ose the databaes
20940 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65   connection.  Re
20950 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  port errors..*/.
20960 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71  void close_db(sq
20970 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
20980 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
20990 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20  lose(db);.  if( 
209a0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
209b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
209c0 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c  rror: sqlite3_cl
209d0 6f 73 65 28 29 20 72 65 74 75 72 6e 73 20 25 64  ose() returns %d
209e0 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
209f0 20 72 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72   rc, sqlite3_err
20a00 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d  msg(db));.  } .}
20a10 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c  ..#if HAVE_READL
20a20 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54  INE || HAVE_EDIT
20a30 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c  LINE./*.** Readl
20a40 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ine completion c
20a50 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74  allbacks.*/.stat
20a60 69 63 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e  ic char *readlin
20a70 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e  e_completion_gen
20a80 65 72 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61  erator(const cha
20a90 72 20 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61  r *text, int sta
20aa0 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  te){.  static sq
20ab0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
20ac0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
20ad0 52 65 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65  Ret;.  if( state
20ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
20af0 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74  *zSql;.    sqlit
20b00 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
20b10 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  t);.    zSql = s
20b20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
20b30 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
20b40 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
20b50 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d       "  FROM com
20b80 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45  pletion(%Q) ORDE
20b90 52 20 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a  R BY 1", text);.
20ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
20bb0 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
20bc0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
20bd0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
20be0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
20bf0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
20c00 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
20c10 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
20c20 7a 52 65 74 20 3d 20 73 74 72 64 75 70 28 28 63  zRet = strdup((c
20c30 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
20c40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
20c50 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c  Stmt, 0));.  }el
20c60 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
20c70 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
20c80 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a  .    pStmt = 0;.
20c90 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
20ca0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
20cb0 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  .}.static char *
20cc0 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
20cd0 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
20ce0 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61  *zText, int iSta
20cf0 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20  rt, int iEnd){. 
20d00 20 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f   rl_attempted_co
20d10 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20  mpletion_over = 
20d20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63  1;.  return rl_c
20d30 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65  ompletion_matche
20d40 73 28 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e  s(zText, readlin
20d50 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e  e_completion_gen
20d60 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69  erator);.}..#eli
20d70 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45  f HAVE_LINENOISE
20d80 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65  ./*.** Linenoise
20d90 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c   completion call
20da0 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  back.*/.static v
20db0 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f  oid linenoise_co
20dc0 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63  mpletion(const c
20dd0 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65  har *zLine, line
20de0 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73  noiseCompletions
20df0 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *lc){.  int nLi
20e00 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  ne = strlen30(zL
20e10 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69  ine);.  int i, i
20e20 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33  Start;.  sqlite3
20e30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
20e40 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
20e50 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
20e60 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e  ];..  if( nLine>
20e70 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20  sizeof(zBuf)-30 
20e80 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
20e90 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c  zLine[0]=='.' ||
20ea0 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20   zLine[0]=='#') 
20eb0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
20ec0 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26  nLine-1; i>=0 &&
20ed0 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b   (isalnum(zLine[
20ee0 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d  i]) || zLine[i]=
20ef0 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='_'); i--){}.  
20f00 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29  if( i==nLine-1 )
20f10 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72   return;.  iStar
20f20 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70  t = i+1;.  memcp
20f30 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69  y(zBuf, zLine, i
20f40 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  Start);.  zSql =
20f50 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20f60 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  ("SELECT DISTINC
20f70 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c  T candidate COLL
20f80 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20  ATE nocase".    
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d       "  FROM com
20fb0 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f  pletion(%Q,%Q) O
20fc0 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20  RDER BY 1",.    
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61       &zLine[iSta
20ff0 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73  rt], zLine);.  s
21000 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
21010 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c  2(globalDb, zSql
21020 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
21030 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
21040 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zSql);.  sqlite
21050 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c  3_exec(globalDb,
21060 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f   "PRAGMA page_co
21070 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20  unt", 0, 0, 0); 
21080 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65  /* Load the sche
21090 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73  ma */.  while( s
210a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
210b0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
210c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
210d0 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20   *zCompletion = 
210e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
210f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
21100 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
21110 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  int nCompletion 
21120 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
21130 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
21140 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  ;.    if( iStart
21150 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73  +nCompletion < s
21160 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b  izeof(zBuf)-1 ){
21170 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
21180 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70  uf+iStart, zComp
21190 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74  letion, nComplet
211a0 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69  ion+1);.      li
211b0 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65  nenoiseAddComple
211c0 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a  tion(lc, zBuf);.
211d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
211e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
211f0 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  mt);.}.#endif../
21200 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61  *.** Do C-langua
21210 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69  ge style dequoti
21220 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20  ng..**.**    \a 
21230 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20     -> alarm.**  
21240 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73    \b    -> backs
21250 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20  pace.**    \t   
21260 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e   -> tab.**    \n
21270 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a      -> newline.*
21280 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65  *    \v    -> ve
21290 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20  rtical tab.**   
212a0 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66   \f    -> form f
212b0 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20  eed.**    \r    
212c0 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75  -> carriage retu
212d0 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d  rn.**    \s    -
212e0 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22  > space.**    \"
212f0 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c      -> ".**    \
21300 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20  '    -> '.**    
21310 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61  \\    -> backsla
21320 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d  sh.**    \NNN  -
21330 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65  > ascii characte
21340 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a  r NNN in octal.*
21350 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
21360 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
21370 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
21380 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
21390 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26  ;.  while( *z &&
213a0 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b   *z!='\\' ) z++;
213b0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
213c0 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
213d0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
213e0 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31  c=='\\' && z[i+1
213f0 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20  ]!=0 ){.      c 
21400 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  = z[++i];.      
21410 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20  if( c=='a' ){.  
21420 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a        c = '\a';.
21430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21440 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  c=='b' ){.      
21450 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20    c = '\b';.    
21460 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
21470 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  t' ){.        c 
21480 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65  = '\t';.      }e
21490 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29  lse if( c=='n' )
214a0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
214b0 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n';.      }else 
214c0 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20  if( c=='v' ){.  
214d0 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a        c = '\v';.
214e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
214f0 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
21500 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
21510 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
21520 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  r' ){.        c 
21530 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65  = '\r';.      }e
21540 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
21550 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22  {.        c = '"
21560 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21570 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
21580 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a        c = '\'';.
21590 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
215a0 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
215b0 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20     c = '\\';.   
215c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
215d0 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
215e0 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
215f0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
21600 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
21610 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
21620 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
21630 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
21640 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
21650 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
21660 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
21670 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
21680 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
21690 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
216a0 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
216b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
216c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
216d0 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
216e0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69  c;.  }.  if( j<i
216f0 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a   ) z[j] = 0;.}..
21700 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
21710 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20 61  zArg as either a
21720 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62  n integer or a b
21730 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52  oolean value.  R
21740 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20  eturn 1 or 0.** 
21750 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c  for TRUE and FAL
21760 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  SE.  Return the 
21770 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 66  integer value if
21780 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
21790 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c  .static int bool
217a0 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  eanValue(const c
217b0 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e  har *zArg){.  in
217c0 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  t i;.  if( zArg[
217d0 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  0]=='0' && zArg[
217e0 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66  1]=='x' ){.    f
217f0 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74  or(i=2; hexDigit
21800 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d  Value(zArg[i])>=
21810 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73  0; i++){}.  }els
21820 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
21830 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20  zArg[i]>='0' && 
21840 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b  zArg[i]<='9'; i+
21850 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69  +){}.  }.  if( i
21860 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30  >0 && zArg[i]==0
21870 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28   ) return (int)(
21880 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72  integerValue(zAr
21890 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  g) & 0xffffffff)
218a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
218b0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
218c0 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  n")==0 || sqlite
218d0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
218e0 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yes")==0 ){.    
218f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21900 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
21910 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29  cmp(zArg, "off")
21920 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
21930 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22  tricmp(zArg,"no"
21940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
21950 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38  rn 0;.  }.  utf8
21960 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21970 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f  "ERROR: Not a bo
21980 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25  olean value: \"%
21990 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22  s\". Assuming \"
219a0 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  no\".\n",.      
219b0 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74      zArg);.  ret
219c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
219d0 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73  Set or clear a s
219e0 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64  hell flag accord
219f0 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e  ing to a boolean
21a00 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
21a10 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61  c void setOrClea
21a20 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65  rFlag(ShellState
21a30 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46   *p, unsigned mF
21a40 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  lag, const char 
21a50 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f  *zArg){.  if( bo
21a60 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29  oleanValue(zArg)
21a70 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74   ){.    ShellSet
21a80 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
21a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65    }else{.    She
21aa0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d  llClearFlag(p, m
21ab0 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Flag);.  }.}../*
21ac0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74  .** Close an out
21ad0 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69  put file, assumi
21ae0 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64  ng it is not std
21af0 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f  err or stdout.*/
21b00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
21b10 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46  put_file_close(F
21b20 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66  ILE *f){.  if( f
21b30 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26   && f!=stdout &&
21b40 20 66 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c   f!=stderr ) fcl
21b50 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(f);.}../*.**
21b60 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20   Try to open an 
21b70 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54  output file.   T
21b80 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74  he names "stdout
21b90 22 20 61 6e 64 20 22 73 74 64 65 72 72 22 20 61  " and "stderr" a
21ba0 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64  re.** recognized
21bb0 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68   and do the righ
21bc0 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69  t thing.  NULL i
21bd0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
21be0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65  e output.** file
21bf0 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a  name is "off"..*
21c00 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f  /.static FILE *o
21c10 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
21c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21c30 65 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65  e, int bTextMode
21c40 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20  ){.  FILE *f;.  
21c50 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
21c60 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
21c70 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b  .    f = stdout;
21c80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
21c90 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65  cmp(zFile, "stde
21ca0 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  rr")==0 ){.    f
21cb0 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c   = stderr;.  }el
21cc0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
21cd0 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29  ile, "off")==0 )
21ce0 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d  {.    f = 0;.  }
21cf0 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f  else{.    f = fo
21d00 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74  pen(zFile, bText
21d10 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62  Mode ? "w" : "wb
21d20 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30  ");.    if( f==0
21d30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
21d40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
21d50 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
21d60 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
21d70 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  le);.    }.  }. 
21d80 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69   return f;.}..#i
21d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21da0 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 41 20  T_TRACE./*.** A 
21db0 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64  routine for hand
21dc0 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d  ling output from
21dd0 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
21de0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21df0 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61  sql_trace_callba
21e00 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d  ck(.  unsigned m
21e10 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
21e20 20 54 68 65 20 74 72 61 63 65 20 74 79 70 65 20   The trace type 
21e30 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  */.  void *pArg,
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e50 54 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 70  The ShellState p
21e60 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f 69 64  ointer */.  void
21e70 20 2a 70 50 2c 20 20 20 20 20 20 20 20 20 20 20   *pP,           
21e80 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 61      /* Usually a
21e90 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   pointer to sqli
21ea0 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20 76 6f 69  te_stmt */.  voi
21eb0 64 20 2a 70 58 20 20 20 20 20 20 20 20 20 20 20  d *pX           
21ec0 20 20 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72       /* Auxiliar
21ed0 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20  y output */.){. 
21ee0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
21ef0 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
21f00 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rg;.  sqlite3_st
21f10 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e  mt *pStmt;.  con
21f20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
21f30 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20 69 66 28   int nSql;.  if(
21f40 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20   p->traceOut==0 
21f50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
21f60 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( mType==SQLITE_
21f70 54 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20  TRACE_CLOSE ){. 
21f80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
21f90 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 2d 2d 20  ->traceOut, "-- 
21fa0 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61 73 65  closing database
21fb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22 29 3b   connection\n");
21fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
21fd0 20 7d 0a 20 20 69 66 28 20 6d 54 79 70 65 21 3d   }.  if( mType!=
21fe0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
21ff0 20 26 26 20 28 28 63 6f 6e 73 74 20 63 68 61 72   && ((const char
22000 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27 20 29 7b  *)pX)[0]=='-' ){
22010 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e  .    zSql = (con
22020 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 7d  st char*)pX;.  }
22030 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d 74 20  else{.    pStmt 
22040 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  = (sqlite3_stmt*
22050 29 70 50 3b 0a 20 20 20 20 73 77 69 74 63 68 28  )pP;.    switch(
22060 20 70 2d 3e 65 54 72 61 63 65 54 79 70 65 20 29   p->eTraceType )
22070 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  {.      case SHE
22080 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e 44 45  LL_TRACE_EXPANDE
22090 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  D: {.        zSq
220a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61  l = sqlite3_expa
220b0 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b  nded_sql(pStmt);
220c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
220d0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
220e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
220f0 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 63 61 73  MALIZE.      cas
22100 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f  e SHELL_TRACE_NO
22110 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RMALIZED: {.    
22120 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
22130 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73 71  e3_normalized_sq
22140 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
22150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22160 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 65  .#endif.      de
22170 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
22180 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
22190 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
221a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
221b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
221c0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
221d0 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c 20 3d 20  urn 0;.  nSql = 
221e0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
221f0 20 20 77 68 69 6c 65 28 20 6e 53 71 6c 3e 30 20    while( nSql>0 
22200 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31 5d 3d  && zSql[nSql-1]=
22210 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d 3b 20  =';' ){ nSql--; 
22220 7d 0a 20 20 73 77 69 74 63 68 28 20 6d 54 79 70  }.  switch( mTyp
22230 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
22240 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 3a 0a  LITE_TRACE_ROW:.
22250 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22260 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20 20  TRACE_STMT: {.  
22270 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
22280 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e  p->traceOut, "%.
22290 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53  *s;\n", nSql, zS
222a0 71 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ql);.      break
222b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
222c0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52   SQLITE_TRACE_PR
222d0 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73  OFILE: {.      s
222e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 61  qlite3_int64 nNa
222f0 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c 69 74 65  nosec = *(sqlite
22300 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a 20 20 20  3_int64*)pX;.   
22310 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
22320 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e 2a  ->traceOut, "%.*
22330 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c 6e 22  s; -- %lld ns\n"
22340 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 4e  , nSql, zSql, nN
22350 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20 20 20 62  anosec);.      b
22360 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
22370 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22380 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
22390 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
223a0 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
223b0 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
223c0 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
223d0 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
223e0 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
223f0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
22400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22410 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
22420 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
22430 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
22440 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
22450 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
22460 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
22470 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
22480 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
22490 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
224a0 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
224b0 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
224c0 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
224d0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
224e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
224f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
22500 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
22510 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
22520 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
22530 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
22540 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
22550 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
22560 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
22570 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22590 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
225a0 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
225b0 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
225c0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
225d0 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
225e0 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
225f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
22600 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
22610 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
22620 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
22630 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
22640 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
22650 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
22660 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
22670 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
22680 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
22690 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
226a0 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
226b0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
226c0 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
226d0 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
226e0 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
226f0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
22700 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
22710 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
22720 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
22730 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
22740 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
22750 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
22760 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
22770 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
22780 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
22790 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
227a0 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
227b0 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
227c0 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
227d0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
227e0 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
227f0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
22800 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ->z==0 ) shell_o
22810 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
22820 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b    }.  p->z[p->n+
22830 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a  +] = (char)c;.}.
22840 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
22850 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74  e field of CSV t
22860 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65  ext.  Compatible
22870 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e   with rfc4180 an
22880 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69  d extended.** wi
22890 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66  th the option of
228a0 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61   having a separa
228b0 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22  tor other than "
228c0 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49  ,"..**.**   +  I
228d0 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  nput comes from 
228e0 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53  p->in..**   +  S
228f0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
22900 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70  p->z of length p
22910 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ->n.  Space to h
22920 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a  old p->z comes.*
22930 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69  *      from sqli
22940 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a  te3_malloc64()..
22950 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63  **   +  Use p->c
22960 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  Sep as the colum
22970 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  n separator.  Th
22980 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22  e default is ","
22990 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
229a0 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
229b0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
229c0 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22   default is "\n"
229d0 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
229e0 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
229f0 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
22a00 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
22a10 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
22a20 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
22a30 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
22a40 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
22a50 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
22a60 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
22a70 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
22a80 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
22a90 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
22aa0 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63   *SQLITE_CDECL c
22ab0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
22ac0 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
22ad0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
22ae0 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
22af0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
22b00 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
22b10 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
22b20 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
22b30 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
22b40 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
22b50 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
22b60 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
22b70 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20   }.  if( c=='"' 
22b80 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70  ){.    int pc, p
22b90 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  pc;.    int star
22ba0 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65  tLine = p->nLine
22bb0 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65  ;.    int cQuote
22bc0 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70   = c;.    pc = p
22bd0 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  pc = 0;.    whil
22be0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20  e( 1 ){.      c 
22bf0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
22c00 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65        if( c==rSe
22c10 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a  p ) p->nLine++;.
22c20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75        if( c==cQu
22c30 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
22c40 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b  f( pc==cQuote ){
22c50 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
22c60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
22c70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
22c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22c90 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70  f( (c==cSep && p
22ca0 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
22cb0 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
22cc0 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
22cd0 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
22ce0 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
22cf0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
22d00 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26     || (c==EOF &&
22d10 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
22d20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f     ){.        do
22d30 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
22d40 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51  ( p->z[p->n]!=cQ
22d50 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20  uote );.        
22d60 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
22d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22d80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
22d90 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d  c==cQuote && c!=
22da0 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
22db0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22dc0 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
22dd0 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
22de0 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
22df0 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
22e00 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
22e10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22e20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
22e30 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
22e40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
22e50 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
22e60 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
22e70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22e80 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
22e90 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
22ea0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
22eb0 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
22ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22ed0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
22ee0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
22ef0 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a        ppc = pc;.
22f00 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
22f10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
22f20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
22f30 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62  he first field b
22f40 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20  eing parsed and 
22f50 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  it begins with t
22f60 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20  he.    ** UTF-8 
22f70 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46  BOM  (0xEF BB BF
22f80 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
22f90 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  BOM */.    if( (
22fa0 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26  c&0xff)==0xef &&
22fb0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30   p->bNotFirst==0
22fc0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
22fd0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
22fe0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
22ff0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
23000 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
23010 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
23020 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
23030 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
23040 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
23050 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
23060 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
23070 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
23080 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
23090 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
230a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
230b0 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
230c0 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
230d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
230e0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d  }.    while( c!=
230f0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
23100 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
23110 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
23120 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
23130 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
23140 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
23150 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
23160 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
23170 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30        if( p->n>0
23180 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d   && p->z[p->n-1]
23190 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b  =='\r' ) p->n--;
231a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54  .    }.    p->cT
231b0 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  erm = c;.  }.  i
231c0 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
231d0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  ->n] = 0;.  p->b
231e0 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
231f0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
23200 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
23210 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20   field of ASCII 
23220 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a  delimited text..
23230 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
23240 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
23250 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
23260 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
23270 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
23280 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
23290 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
232a0 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
232b0 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
232c0 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
232d0 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
232e0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
232f0 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e  fault is "\x1F".
23300 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
23310 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
23320 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
23330 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45  default is "\x1E
23340 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
23350 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77  track of the row
23360 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
23370 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
23380 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
23390 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
233a0 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
233b0 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
233c0 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
233d0 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
233e0 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
233f0 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
23400 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
23410 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61   *SQLITE_CDECL a
23420 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
23430 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
23440 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
23450 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
23460 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
23470 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
23480 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
23490 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
234a0 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
234b0 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
234c0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
234d0 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
234e0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21  .  }.  while( c!
234f0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
23500 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
23510 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
23520 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
23530 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
23540 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72  ;.  }.  if( c==r
23550 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  Sep ){.    p->nL
23560 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ine++;.  }.  p->
23570 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28  cTerm = c;.  if(
23580 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
23590 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  n] = 0;.  return
235a0 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p->z;.}../*.** 
235b0 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
235c0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a  data for table z
235d0 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72  Table.  If an er
235e0 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c  ror is seen whil
235f0 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77  e.** moving forw
23600 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62  ard, try to go b
23610 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62  ackwards.  The b
23620 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e  ackwards movemen
23630 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20  t won't.** work 
23640 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
23650 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  D tables..*/.sta
23660 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
23670 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c  oneData(.  Shell
23680 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
23690 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
236a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
236b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
236c0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
236d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
236e0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63  pInsert = 0;.  c
236f0 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
23700 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  .  char *zInsert
23710 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
23720 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
23730 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74   int nTable = st
23740 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a  rlen30(zTable);.
23750 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69    int k = 0;.  i
23760 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f  nt cnt = 0;.  co
23770 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65  nst int spinRate
23780 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75   = 10000;..  zQu
23790 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
237a0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
237b0 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54  FROM \"%w\"", zT
237c0 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  able);.  rc = sq
237d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
237e0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
237f0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
23800 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23810 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23820 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
23830 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
23840 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23850 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
23860 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
23870 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
23880 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
23890 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
238a0 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
238b0 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65    }.  n = sqlite
238c0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
238d0 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72  Query);.  zInser
238e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
238f0 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c  oc64(200 + nTabl
23900 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20  e + n*3);.  if( 
23910 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65  zInsert==0 ) she
23920 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
23930 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ();.  sqlite3_sn
23940 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c  printf(200+nTabl
23950 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20  e,zInsert,.     
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
23970 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
23980 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55  INTO \"%s\" VALU
23990 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
239a0 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    i = strlen30(z
239b0 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
239c0 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
239d0 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
239e0 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
239f0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
23a00 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
23a10 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
23a20 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23a30 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
23a40 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
23a50 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
23a60 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
23a70 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
23a80 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
23a90 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
23aa0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
23ab0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
23ac0 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
23ad0 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
23ae0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
23af0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
23b00 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
23b10 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
23b20 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
23b30 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
23b40 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
23b50 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
23b60 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
23b70 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
23b80 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
23b90 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
23ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
23bb0 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
23bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23bd0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
23be0 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
23bf0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
23c00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23c10 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
23c20 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
23c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23c40 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
23c50 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
23c60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
23c70 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
23c80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23c90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23ca0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
23cb0 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
23cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
23cd0 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
23ce0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
23cf0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
23d00 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
23d10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23d30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23d40 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
23d50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23d60 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
23d70 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
23da0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
23db0 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
23de0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
23df0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23e00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23e10 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
23e20 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
23e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
23e40 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
23e50 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
23e60 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
23e70 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
23eb0 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
23ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
23ef0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
23f00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
23f30 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
23f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23f50 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
23f60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23f70 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
23f80 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
23f90 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
23fa0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
23fb0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
23fc0 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
23fd0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
23fe0 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
24010 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
24020 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
24030 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
24040 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
24050 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
24060 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
24070 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
24080 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
24090 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
240a0 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
240b0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
240c0 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
240d0 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
240e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
240f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
24100 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
24110 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
24120 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
24130 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
24140 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24150 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
24160 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
24170 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
241a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
241b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
241c0 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
241d0 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
241e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
241f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
24200 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
24210 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
24220 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
24230 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
24240 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
24250 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
24260 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
24270 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
24280 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
24290 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
242a0 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
242b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
242c0 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
242d0 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
242e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
242f0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
24300 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
24310 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
24320 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
24330 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
24340 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
24350 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
24360 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
24370 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
24380 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
24390 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
243a0 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
243b0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
243c0 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
243d0 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
243e0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
243f0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
24400 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
24410 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
24420 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24430 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
24440 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
24450 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
24460 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
24470 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24480 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
24490 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
244a0 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
244b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
244c0 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
244d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
244e0 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
244f0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
24500 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
24510 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
24520 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
24530 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
24560 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
24570 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
24580 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
24590 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
245a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
245b0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
245c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
245d0 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
245e0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
245f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24600 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
24610 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
24620 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
24630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24640 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
24650 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
24660 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
24670 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
24680 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
24690 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
246a0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
246b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
246c0 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
246d0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
246e0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
246f0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
24700 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
24710 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
24720 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
24730 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
24740 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
24750 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
24760 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
24770 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
24780 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
24790 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
247a0 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
247b0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
247c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
247d0 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
247e0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
247f0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
24800 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
24810 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
24820 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
24830 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
24840 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
24850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24860 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
24870 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
24880 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
24890 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
248a0 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
248b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
248c0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
248d0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
248e0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
24910 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
24920 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
24930 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
24940 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
24950 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
24960 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
24970 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
24980 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24990 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
249a0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
249d0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
249e0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
249f0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24a10 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
24a20 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
24a30 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
24a40 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
24a50 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
24a60 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
24a70 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
24a80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24a90 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
24aa0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
24ab0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
24ac0 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
24ad0 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
24ae0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
24af0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
24b00 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
24b10 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
24b20 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
24b30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
24b40 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
24b50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24b60 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
24b70 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
24b80 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
24b90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24ba0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
24bb0 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
24bc0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
24bd0 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
24be0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
24bf0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
24c00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
24c10 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
24c20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
24c30 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
24c40 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
24c50 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
24c60 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
24c70 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
24c80 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
24c90 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
24ca0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
24cb0 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
24cc0 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
24cd0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
24ce0 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
24cf0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
24d00 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
24d10 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
24d20 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
24d30 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
24d40 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
24d50 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
24d60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
24d70 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
24d80 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
24d90 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
24da0 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
24db0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
24dc0 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
24dd0 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
24de0 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
24df0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
24e00 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
24e10 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
24e20 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
24e30 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
24e40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
24e50 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
24e60 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
24e70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
24e80 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
24e90 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
24ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
24eb0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
24ec0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
24ed0 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
24ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
24ef0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
24f00 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
24f10 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
24f20 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
24f30 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
24f40 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
24f50 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
24f60 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
24f70 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
24f80 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
24f90 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
24fa0 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
24fb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
24fc0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
24fd0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
24fe0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
24ff0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
25000 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b  close_db(newDb);
25010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
25020 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
25030 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e   back to stdout.
25040 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d  .**.** If the p-
25050 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20  >doXdgOpen flag 
25060 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61  is set, that mea
25070 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20 77 61  ns the output wa
25080 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72  s being.** redir
25090 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f  ected to a tempo
250a0 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20  rary file named 
250b0 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e  by p->zTempFile.
250c0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a    In that case,.
250d0 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f  ** launch start/
250e0 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e  open/xdg-open on
250f0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
25100 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
25110 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65  void output_rese
25120 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
25130 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69  {.  if( p->outfi
25140 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
25150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25160 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f  T_POPEN.    pclo
25170 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  se(p->out);.#end
25180 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
25190 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
251a0 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64  e(p->out);.#ifnd
251b0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
251c0 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20  _SYSTEM.    if( 
251d0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a  p->doXdgOpen ){.
251e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
251f0 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a   *zXdgOpenCmd =.
25200 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
25210 33 32 29 0a 20 20 20 20 20 20 22 73 74 61 72 74  32).      "start
25220 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ";.#elif defined
25230 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
25240 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a    "open";.#else.
25250 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22        "xdg-open"
25260 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  ;.#endif.      c
25270 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20  har *zCmd;.     
25280 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
25290 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c  mprintf("%s %s",
252a0 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d   zXdgOpenCmd, p-
252b0 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  >zTempFile);.   
252c0 20 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43     if( system(zC
252d0 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  md) ){.        u
252e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
252f0 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d  r, "Failed: [%s]
25300 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20  \n", zCmd);.    
25310 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25320 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
25330 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f      outputModePo
25340 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  p(p);.      p->d
25350 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  oXdgOpen = 0;.  
25360 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
25370 70 28 31 30 30 29 3b 0a 20 20 20 20 7d 0a 23 65  p(100);.    }.#e
25380 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
25390 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53  (SQLITE_NOHAVE_S
253a0 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20  YSTEM) */.  }.  
253b0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
253c0 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
253d0 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
253e0 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
253f0 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
25400 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
25410 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
25420 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
25430 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
25440 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
25450 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
25460 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
25470 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
25480 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
25490 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
254a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
254b0 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
254c0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
254d0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
254e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
254f0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
25500 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
25510 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
25520 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
25530 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
25540 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
25550 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
25560 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
25570 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
25580 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
25590 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
255a0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
255b0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
255c0 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
255d0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
255e0 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
255f0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
25600 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
25610 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
25620 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
25630 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
25640 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
25650 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
25660 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
25670 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
25680 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
25690 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
256a0 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
256b0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
256c0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
256d0 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
256e0 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
256f0 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
25700 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
25710 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
25720 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
25730 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
25740 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
25750 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
25760 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
25770 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
25780 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
25790 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
257a0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
257b0 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
257c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
257d0 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
257e0 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
257f0 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
25800 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
25810 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
25820 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
25830 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
25840 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
25850 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
25860 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
25870 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
25880 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
25890 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
258a0 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
258b0 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
258c0 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
258d0 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
258e0 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
258f0 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
25900 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
25910 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
25920 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
25930 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
25940 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
25950 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
25960 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
25970 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
25980 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
25990 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
259a0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
259b0 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
259c0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
259d0 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
259e0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
259f0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
25a00 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
25a10 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
25a20 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
25a30 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
25a40 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
25a50 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
25a60 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
25a70 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
25a80 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
25a90 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
25aa0 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
25ab0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
25ac0 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
25ad0 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
25ae0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
25af0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  rc;.  unsigned i
25b00 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63  DataVersion;.  c
25b10 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b  har *zSchemaTab;
25b20 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e  .  char *zDb = n
25b30 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
25b40 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71  ] : "main";.  sq
25b50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
25b60 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  t = 0;.  unsigne
25b70 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
25b80 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30  ;.  open_db(p, 0
25b90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  );.  if( p->db==
25ba0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
25bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
25bc0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20  pare_v2(p->db,. 
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
25be0 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71  ECT data FROM sq
25bf0 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20  lite_dbpage(?1) 
25c00 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20  WHERE pgno=1",. 
25c10 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
25c20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
25c30 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
25c40 21 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65  !sqlite3_compile
25c50 6f 70 74 69 6f 6e 5f 75 73 65 64 28 22 45 4e 41  option_used("ENA
25c60 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 22  BLE_DBPAGE_VTAB"
25c70 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
25c80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25c90 74 68 65 20 5c 22 2e 64 62 69 6e 66 6f 5c 22 20  the \".dbinfo\" 
25ca0 63 6f 6d 6d 61 6e 64 20 72 65 71 75 69 72 65 73  command requires
25cb0 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20   the ".         
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 20 22 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c   "-DSQLITE_ENABL
25ce0 45 5f 44 42 50 41 47 45 5f 56 54 41 42 20 63 6f  E_DBPAGE_VTAB co
25cf0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
25d00 6e 73 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  ns\n");.    }els
25d10 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
25d20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 65 72  intf(stderr, "er
25d30 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
25d40 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
25d50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
25d60 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
25d70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Stmt);.    retur
25d80 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 1;.  }.  sqlit
25d90 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
25da0 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20  mt, 1, zDb, -1, 
25db0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
25dc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
25dd0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
25de0 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69  E_ROW.   && sqli
25df0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
25e00 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20  (pStmt,0)>100.  
25e10 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48  ){.    memcpy(aH
25e20 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  dr, sqlite3_colu
25e30 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29  mn_blob(pStmt,0)
25e40 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69  , 100);.    sqli
25e50 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
25e60 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
25e70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
25e80 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  err, "unable to 
25e90 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
25ea0 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ader\n");.    sq
25eb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
25ec0 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Stmt);.    retur
25ed0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67  n 1;.  }.  i = g
25ee0 65 74 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b  et2byteInt(aHdr+
25ef0 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20  16);.  if( i==1 
25f00 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75  ) i = 65536;.  u
25f10 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
25f20 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
25f30 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20   "database page 
25f40 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74  size:", i);.  ut
25f50 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
25f60 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
25f70 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c  "write format:",
25f80 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74   aHdr[18]);.  ut
25f90 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
25fa0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
25fb0 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20  "read format:", 
25fc0 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66  aHdr[19]);.  utf
25fd0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
25fe0 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
25ff0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 3a 22  reserved bytes:"
26000 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66  , aHdr[20]);.  f
26010 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
26020 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b  ize(aField); i++
26030 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20  ){.    int ofst 
26040 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74  = aField[i].ofst
26050 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
26060 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74  nt val = get4byt
26070 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74  eInt(aHdr + ofst
26080 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
26090 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
260a0 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d  s %u", aField[i]
260b0 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
260c0 20 20 73 77 69 74 63 68 28 20 6f 66 73 74 20 29    switch( ofst )
260d0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 36 3a  {.      case 56:
260e0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76   {.        if( v
260f0 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e  al==1 ) raw_prin
26100 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
26110 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  f8)");.        i
26120 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f  f( val==2 ) raw_
26130 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26140 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20   (utf16le)");.  
26150 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33        if( val==3
26160 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
26170 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62 65  >out, " (utf16be
26180 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )");.      }.   
26190 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
261a0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
261b0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d  .  }.  if( zDb==
261c0 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
261d0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
261e0 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69  rintf("main.sqli
261f0 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  te_master");.  }
26200 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
26210 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29  zDb,"temp")==0 )
26220 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
26230 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
26240 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65  tf("%s", "sqlite
26250 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a  _temp_master");.
26260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63    }else{.    zSc
26270 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65  hemaTab = sqlite
26280 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
26290 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  ".sqlite_master"
262a0 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  , zDb);.  }.  fo
262b0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
262c0 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29  ze(aQuery); i++)
262d0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
262e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
262f0 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71  tf(aQuery[i].zSq
26300 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  l, zSchemaTab);.
26310 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62      int val = db
26320 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20  _int(p, zSql);. 
26330 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26340 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f  zSql);.    utf8_
26350 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26360 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75  %-20s %d\n", aQu
26370 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  ery[i].zName, va
26380 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
26390 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61  3_free(zSchemaTa
263a0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  b);.  sqlite3_fi
263b0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
263c0 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
263d0 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
263e0 2c 20 26 69 44 61 74 61 56 65 72 73 69 6f 6e 29  , &iDataVersion)
263f0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26400 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26410 75 5c 6e 22 2c 20 22 64 61 74 61 20 76 65 72 73  u\n", "data vers
26420 69 6f 6e 22 2c 20 69 44 61 74 61 56 65 72 73 69  ion", iDataVersi
26430 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  on);.  return 0;
26440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
26450 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
26460 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c  te3_errmsg() val
26470 75 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ue to stderr and
26480 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74   return 1..*/.st
26490 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61  atic int shellDa
264a0 74 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69  tabaseError(sqli
264b0 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
264c0 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
264d0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
264e0 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
264f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
26500 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
26510 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
26520 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
26530 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62  pattern in zGlob
26540 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20 74  [] against the t
26550 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ext in z[].  Ret
26560 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74  urn TRUE.** if t
26570 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41  hey match and FA
26580 4c 53 45 20 28 30 29 20 69 66 20 74 68 65 79 20  LSE (0) if they 
26590 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
265a0 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
265b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
265c0 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
265d0 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
265e0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
265f0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
26600 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
26610 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
26620 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
26630 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
26640 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
26650 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
26660 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
26670 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
26680 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
26690 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
266a0 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
266b0 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
266c0 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
266d0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  list..**.**     
266e0 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68   '#'       Match
266f0 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
26700 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  of one or more d
26710 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a  igits with an.**
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20  optional + or - 
26740 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a  sign in front.**
26750 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20 20  .**      ' '    
26760 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77     Any span of w
26770 68 69 74 65 73 70 61 63 65 20 6d 61 74 63 68 65  hitespace matche
26780 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e  s any other span
26790 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
267a0 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65        whitespace
267b0 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68  ..**.** Extra wh
267c0 69 74 65 73 70 61 63 65 20 61 74 20 74 68 65 20  itespace at the 
267d0 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67  end of z[] is ig
267e0 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nored..*/.static
267f0 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c   int testcase_gl
26800 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ob(const char *z
26810 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  Glob, const char
26820 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63   *z){.  int c, c
26830 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b  2;.  int invert;
26840 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20  .  int seen;..  
26850 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a  while( (c = (*(z
26860 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a  Glob++)))!=0 ){.
26870 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
26880 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
26890 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72  !IsSpace(*z) ) r
268a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77  eturn 0;.      w
268b0 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
268c0 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b  Glob) ) zGlob++;
268d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
268e0 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  Space(*z) ) z++;
268f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
26900 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
26910 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f  hile( (c=(*(zGlo
26920 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c  b++))) == '*' ||
26930 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
26940 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26     if( c=='?' &&
26950 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
26960 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
26970 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
26980 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
26990 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
269a0 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
269b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
269c0 20 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f   && testcase_glo
269d0 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20  b(zGlob-1,z)==0 
269e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b  ){.          z++
269f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26a00 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21      return (*z)!
26a10 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
26a20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28    while( (c2 = (
26a30 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20  *(z++)))!=0 ){. 
26a40 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
26a50 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=c ){.         
26a60 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20   c2 = *(z++);.  
26a70 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
26a80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26aa0 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
26ab0 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74  b(zGlob,z) ) ret
26ac0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
26ad0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
26ae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
26af0 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '?' ){.      if(
26b00 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
26b10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
26b20 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
26b30 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
26b40 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  _c = 0;.      se
26b50 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
26b60 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
26b70 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
26b80 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
26b90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20  urn 0;.      c2 
26ba0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
26bb0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
26bc0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
26bd0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
26be0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
26bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26c00 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
26c10 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
26c20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
26c30 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
26c40 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
26c50 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
26c60 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
26c70 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
26c80 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20  & zGlob[0]!=']' 
26c90 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26  && zGlob[0]!=0 &
26ca0 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
26cb0 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
26cc0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
26cd0 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
26ce0 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
26cf0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
26d00 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
26d10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26d20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
26d30 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
26d40 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
26d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26d60 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
26d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d80 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
26d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26da0 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
26db0 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
26dc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26dd0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27  }else if( c=='#'
26de0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a   ){.      if( (z
26df0 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d  [0]=='-' || z[0]
26e00 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67 69  =='+') && IsDigi
26e10 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20  t(z[1]) ) z++;. 
26e20 20 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69       if( !IsDigi
26e30 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  t(z[0]) ) return
26e40 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
26e50 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69       while( IsDi
26e60 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b  git(z[0]) ){ z++
26e70 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ; }.    }else{. 
26e80 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a       if( c!=(*(z
26e90 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ++)) ) return 0;
26ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
26eb0 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
26ec0 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  ){ z++; }.  retu
26ed0 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a  rn *z==0;.}.../*
26ee0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
26ef0 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d  string as a comm
26f00 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
26f10 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20  with either one 
26f20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61  or two.** initia
26f30 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73  l "-" characters
26f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26f50 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  optionMatch(cons
26f60 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
26f70 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b  nst char *zOpt){
26f80 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d  .  if( zStr[0]!=
26f90 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '-' ) return 0;.
26fa0 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20    zStr++;.  if( 
26fb0 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  zStr[0]=='-' ) z
26fc0 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Str++;.  return 
26fd0 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70  strcmp(zStr, zOp
26fe0 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t)==0;.}../*.** 
26ff0 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a  Delete a file..*
27000 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74  /.int shellDelet
27010 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  eFile(const char
27020 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
27030 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
27040 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20  WIN32.  wchar_t 
27050 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
27060 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
27070 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
27080 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a   rc = _wunlink(z
27090 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
270a0 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  e(z);.#else.  rc
270b0 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   = unlink(zFilen
270c0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
270d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
270e0 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65  ** Try to delete
270f0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
27100 69 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73  ile (if there is
27110 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74   one) and free t
27120 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65  he.** memory use
27130 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  d to hold the na
27140 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66  me of the temp f
27150 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
27160 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  oid clearTempFil
27170 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
27180 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  {.  if( p->zTemp
27190 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
271a0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67  ;.  if( p->doXdg
271b0 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20  Open ) return;. 
271c0 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65   if( shellDelete
271d0 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  File(p->zTempFil
271e0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  e) ) return;.  s
271f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
27200 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  TempFile);.  p->
27210 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d  zTempFile = 0;.}
27220 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
27230 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e   new temp file n
27240 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
27250 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74  en suffix..*/.st
27260 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d  atic void newTem
27270 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65  pFile(ShellState
27280 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
27290 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65  *zSuffix){.  cle
272a0 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20  arTempFile(p);. 
272b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
272c0 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
272d0 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
272e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
272f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
27300 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
27310 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  0, SQLITE_FCNTL_
27320 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70  TEMPFILENAME, &p
27330 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
27340 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
27350 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
27360 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
27370 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
27380 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
27390 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a  ), &r);.    p->z
273a0 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
273b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
273c0 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75  %llx.%s", r, zSu
273d0 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
273e0 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
273f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
27400 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a  tf("%z.%s", p->z
27410 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69  TempFile, zSuffi
27420 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  x);.  }.  if( p-
27430 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
27440 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
27450 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20  stderr, "out of 
27460 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
27470 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
27480 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
27490 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
274a0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
274b0 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
274c0 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20  ause(), used.** 
274d0 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b  by the ".lint fk
274e0 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d  ey-indexes" comm
274f0 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72  and. This scalar
27500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77   function is alw
27510 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  ays.** called wi
27520 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74  th four argument
27530 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74  s - the parent t
27540 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70  able name, the p
27550 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arent column nam
27560 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  e,.** the child 
27570 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
27580 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20  he child column 
27590 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b  name..**.**   fk
275a0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
275b0 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20  e('parent-tab', 
275c0 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63  'parent-col', 'c
275d0 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c  hild-tab', 'chil
275e0 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66  d-col').**.** If
275f0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e   either of the n
27600 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63  amed tables or c
27610 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
27620 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ist, this functi
27630 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  on.** returns an
27640 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41   empty string. A
27650 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
27660 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
27670 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a  if both tables.*
27680 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78  * and columns ex
27690 69 73 74 20 62 75 74 20 68 61 76 65 20 74 68 65  ist but have the
276a0 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f   same default co
276b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
276c0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68  . Or,.** if both
276d0 20 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64   exist but the d
276e0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
276f0 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 64   sequences are d
27700 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a  ifferent, this.*
27710 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
27720 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 22 20  ns the string " 
27730 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d  COLLATE <parent-
27740 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65  collation>", whe
27750 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f  re.** <parent-co
27760 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20  llation> is the 
27770 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
27780 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
27790 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e  e parent column.
277a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
277b0 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
277c0 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65  Clause(.  sqlite
277d0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
277e0 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
277f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
27800 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
27810 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
27820 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
27830 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74  e(pCtx);.  const
27840 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a   char *zParent;.
27850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27860 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73  arentCol;.  cons
27870 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53  t char *zParentS
27880 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  eq;.  const char
27890 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73   *zChild;.  cons
278a0 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f  t char *zChildCo
278b0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
278c0 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20  *zChildSeq = 0; 
278d0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
278e0 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f  o avoid false-po
278f0 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a  sitive warning *
27900 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
27910 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29  ssert( nVal==4 )
27920 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63  ;.  zParent = (c
27930 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27940 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
27950 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65  Val[0]);.  zPare
27960 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ntCol = (const c
27970 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
27980 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
27990 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63  );.  zChild = (c
279a0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
279b0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
279c0 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[2]);.  zChil
279d0 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  dCol = (const ch
279e0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
279f0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29  e_text(apVal[3])
27a00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
27a10 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22  ult_text(pCtx, "
27a20 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ", -1, SQLITE_ST
27a30 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71  ATIC);.  rc = sq
27a40 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
27a50 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
27a60 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
27a70 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43  Parent, zParentC
27a80 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53  ol, 0, &zParentS
27a90 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b  eq, 0, 0, 0.  );
27aa0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27ab0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
27ac0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
27ad0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
27ae0 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69          db, "mai
27af0 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69  n", zChild, zChi
27b00 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c  ldCol, 0, &zChil
27b10 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  dSeq, 0, 0, 0.  
27b20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
27b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27b40 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
27b50 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68  (zParentSeq, zCh
27b60 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63  ildSeq) ){.    c
27b70 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
27b80 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41  _mprintf(" COLLA
27b90 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53  TE %s", zParentS
27ba0 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eq);.    sqlite3
27bb0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
27bc0 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  x, z, -1, SQLITE
27bd0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
27be0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
27bf0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
27c00 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
27c10 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e  on of dot-comman
27c20 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  d ".lint fkey-in
27c30 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69  dexes"..*/.stati
27c40 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e  c int lintFkeyIn
27c50 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74  dexes(.  ShellSt
27c60 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
27c70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
27c80 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
27c90 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
27ca0 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
27cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
27cc0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
27cd0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
27ce0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
27cf0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
27d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27d10 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
27d20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
27d30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
27d40 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20   pState->db;    
27d50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
27d60 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22  andle to query "
27d70 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20  main" db of */. 
27d80 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74   FILE *out = pSt
27d90 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20  ate->out;       
27da0 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72   /* Stream to wr
27db0 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75  ite non-error ou
27dc0 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  tput to */.  int
27dd0 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27df0 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70  If -verbose is p
27e00 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
27e10 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
27e20 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
27e30 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74  f -groupbyparent
27e40 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
27e50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
27e80 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a  hrough azArg[] *
27e90 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27ea0 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20  zIndent = "";   
27eb0 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
27ec0 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45  to indent CREATE
27ed0 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69   INDEX by */.  i
27ee0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27f10 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
27f20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pSql = 0;      
27f30 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76     /* Compiled v
27f40 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74  ersion of SQL st
27f50 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  atement below */
27f60 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  /*.  ** This
27f70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27f80 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f  t returns one ro
27f90 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69  w for each forei
27fa0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
27fb0 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63  t.  ** in the sc
27fc0 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e  hema of the main
27fd0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63   database. The c
27fe0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
27ff0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54  :.  **.  ** 0. T
28000 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51  he text of an SQ
28010 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69  L statement simi
28020 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  lar to:.  **.  *
28030 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20  *      "EXPLAIN 
28040 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
28050 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74  T 1 FROM child_t
28060 61 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64  able WHERE child
28070 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a  _key=?".  **.  *
28080 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45 43 54  *    This SELECT
28090 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
280a0 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20  he one that the 
280b0 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70  foreign keys imp
280c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a  lementation.  **
280d0 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e      needs to run
280e0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63   internally on c
280f0 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20  hild tables. If 
28100 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
28110 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  x that can.  ** 
28120 20 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70     be used to op
28130 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72  timize this quer
28140 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61  y, then it can a
28150 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79 20 74  lso be used by t
28160 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d  he FK.  **    im
28170 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20  plementation to 
28180 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
28190 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
281a0 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
281b0 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65  nt.  **    table
281c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41  ..  **.  ** 1. A
281d0 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75   GLOB pattern su
281e0 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  itable for sqlit
281f0 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66  e3_strglob(). If
28200 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74   the plan output
28210 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20   by.  **    the 
28220 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
28230 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68  AN command match
28240 65 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  es this pattern,
28250 20 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   then the schema
28260 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e  .  **    contain
28270 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
28280 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f  can be used to o
28290 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72  ptimize the quer
282a0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20  y..  **.  ** 2. 
282b0 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
282c0 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
282d0 65 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  es the child tab
282e0 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
282f0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
28300 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c       "child_tabl
28310 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68  e(child_key1, ch
28320 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ild_key2)".  **.
28330 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65    ** 3. Human re
28340 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
28350 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 70   describes the p
28360 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
28370 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
28380 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70  **.  **       "p
28390 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65  arent_table(pare
283a0 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f  nt_key1, parent_
283b0 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
283c0 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54   4. A full CREAT
283d0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
283e0 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  t for an index t
283f0 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65  hat could be use
28400 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74  d to.  **    opt
28410 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
28420 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
28430 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s on the parent 
28440 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a  table. e.g..  **
28450 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45  .  **       "CRE
28460 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f  ATE INDEX child_
28470 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20  table_child_key 
28480 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63  ON child_table(c
28490 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a  hild_key)".  **.
284a0 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65    ** 5. The name
284b0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74   of the parent t
284c0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
284d0 54 68 65 73 65 20 73 69 78 20 76 61 6c 75 65 73  These six values
284e0 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65   are used by the
284f0 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74   C logic below t
28500 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72  o generate the r
28510 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f  eport..  */.  co
28520 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
28530 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20  .  "SELECT ".   
28540 20 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20   "     'EXPLAIN 
28550 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
28560 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75  T 1 FROM ' || qu
28570 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
28580 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22 20   WHERE '".    " 
28590 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
285a0 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c  (quote(s.name) |
285b0 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66  | '.' || quote(f
285c0 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27  .[from]) || '=?'
285d0 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65   ".    "  || fke
285e0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
285f0 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 66  (".    "       f
28600 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
28610 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
28620 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
28630 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29  [from]),' AND ')
28640 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
28650 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41 42       'SEARCH TAB
28660 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c  LE ' || s.name |
28670 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49  | ' USING COVERI
28680 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20  NG INDEX*('".   
28690 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
286a0 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44  cat('*=?', ' AND
286b0 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
286c0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 73  ", ".    "     s
286d0 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c  .name  || '(' ||
286e0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
286f0 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c  [from],  ', ') |
28700 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
28710 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
28720 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72  le] || '(' || gr
28730 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45  oup_concat(COALE
28740 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
28750 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20  ame])) || ')'". 
28760 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
28770 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20    'CREATE INDEX 
28780 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
28790 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f  e ||'_'|| group_
287a0 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
287b0 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c   '_'))".    "  |
287c0 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74  | ' ON ' || quot
287d0 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27  e(s.name) || '('
287e0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
287f0 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66  p_concat(quote(f
28800 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20  .[from]) ||".   
28810 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63   "        fkey_c
28820 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a  ollate_clause(".
28830 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 66      "          f
28840 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
28850 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
28860 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
28870 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a  [from]), ', ')".
28880 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a      "  || ');'".
28890 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
288a0 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20     f.[table] ". 
288b0 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
288c0 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72 61  master AS s, pra
288d0 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  gma_foreign_key_
288e0 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20  list(s.name) AS 
288f0 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f  f ".    "LEFT JO
28900 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  IN pragma_table_
28910 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b  info AS p ON (pk
28920 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67  -1=seq AND p.arg
28930 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20  =f.[table]) ".  
28940 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61    "GROUP BY s.na
28950 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22  me, f.id ".    "
28960 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20 57  ORDER BY (CASE W
28970 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61  HEN ? THEN f.[ta
28980 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65  ble] ELSE s.name
28990 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e   END)".  ;.  con
289a0 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50  st char *zGlobIP
289b0 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c  K = "SEARCH TABL
289c0 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45  E * USING INTEGE
289d0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
289e0 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72  owid=?)";..  for
289f0 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=2; i<nArg; i+
28a00 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
28a10 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69  strlen30(azArg[i
28a20 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20  ]);.    if( n>1 
28a30 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
28a40 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20  cmp("-verbose", 
28a50 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
28a60 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73  ){.      bVerbos
28a70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
28a80 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26   else if( n>1 &&
28a90 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
28aa0 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  p("-groupbyparen
28ab0 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  t", azArg[i], n)
28ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72  ==0 ){.      bGr
28ad0 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b  oupByParent = 1;
28ae0 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d  .      zIndent =
28af0 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20   "    ";.    }. 
28b00 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72     else{.      r
28b10 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28b20 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73 20  , "Usage: %s %s 
28b30 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f  ?-verbose? ?-gro
28b40 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a  upbyparent?\n",.
28b50 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
28b60 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20  0], azArg[1].   
28b70 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
28b80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
28b90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28ba0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6b   Register the fk
28bb0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
28bc0 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
28bd0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
28be0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
28bf0 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c  on(db, "fkey_col
28c00 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c  late_clause", 4,
28c10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
28c20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79      0, shellFkey
28c30 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30  CollateClause, 0
28c40 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28  , 0.  );...  if(
28c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28c60 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
28c70 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
28c80 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71  , zSql, -1, &pSq
28c90 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
28ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
28cc0 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20  nd_int(pSql, 1, 
28cd0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b  bGroupByParent);
28ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
28cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28d00 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68   int rc2;.    ch
28d10 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20  ar *zPrev = 0;. 
28d20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
28d30 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
28d40 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20  ep(pSql) ){.    
28d50 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a    int res = -1;.
28d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
28d70 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30  mt *pExplain = 0
28d80 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
28d90 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73  ar *zEQP = (cons
28da0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
28db0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
28dc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
28dd0 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20  t char *zGlob = 
28de0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
28df0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
28e00 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20  (pSql, 1);.     
28e10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72   const char *zFr
28e20 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  om = (const char
28e30 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
28e40 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a  _text(pSql, 2);.
28e50 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28e60 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e   *zTarget = (con
28e70 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
28e80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
28e90 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 3);.      con
28ea0 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28  st char *zCI = (
28eb0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
28ec0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
28ed0 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  pSql, 4);.      
28ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
28ef0 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
28f00 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
28f10 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b  n_text(pSql, 5);
28f20 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
28f30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
28f40 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
28f50 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
28f60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28f70 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
28f80 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
28f90 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
28fa0 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
28fb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28fc0 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74   *zPlan = (const
28fd0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
28fe0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
28ff0 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  ain, 3);.       
29000 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20   res = (.       
29010 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
29020 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c  3_strglob(zGlob,
29030 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20   zPlan).        
29040 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33     || 0==sqlite3
29050 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50  _strglob(zGlobIP
29060 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  K, zPlan).      
29070 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
29080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
29090 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
290a0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
290b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
290c0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
290d0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
290e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
290f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65  rr, "Error: inte
29100 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20  rnal error");.  
29110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29130 20 20 69 66 28 20 62 47 72 6f 75 70 42 79 50 61    if( bGroupByPa
29140 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20  rent.        && 
29150 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73  (bVerbose || res
29160 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
29170 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c  (zPrev==0 || sql
29180 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
29190 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20  rent, zPrev)).  
291a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
291b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
291c0 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61  t, "-- Parent ta
291d0 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65  ble %s\n", zPare
291e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
291f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
29200 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50  v);.          zP
29210 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  rev = sqlite3_mp
29220 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72  rintf("%s", zPar
29230 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
29240 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
29250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29260 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
29270 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22   "%s%s --> %s\n"
29280 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20  , zIndent, zCI, 
29290 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  zTarget);.      
292a0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72    }else if( bVer
292b0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
292c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
292d0 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61  , "%s/* no extra
292e0 20 69 6e 64 65 78 65 73 20 72 65 71 75 69 72 65   indexes require
292f0 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a  d for %s -> %s *
29300 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
29310 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72      zIndent, zFr
29320 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20  om, zTarget.    
29330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29340 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29350 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29360 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69  e(zPrev);..    i
29370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29380 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
29390 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
293a0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
293b0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
293c0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
293d0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c  e3_finalize(pSql
293e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
293f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21  QLITE_OK && rc2!
29400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29410 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
29420 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29430 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
29440 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
29450 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
29460 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
29470 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
29480 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
29490 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (db));.  }..  re
294a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
294b0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
294c0 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20   of ".lint" dot 
294d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
294e0 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f  ic int lintDotCo
294f0 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
29500 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
29510 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
29520 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
29530 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
29540 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
29550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
29560 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
29570 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
29580 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
29590 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
295a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
295b0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
295c0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
295d0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20  .  int n;.  n = 
295e0 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65  (nArg>=2 ? strle
295f0 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20  n30(azArg[1]) : 
29600 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c  0);.  if( n<1 ||
29610 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
29620 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65  p(azArg[1], "fke
29630 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29  y-indexes", n) )
29640 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72   goto usage;.  r
29650 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e  eturn lintFkeyIn
29660 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a  dexes(pState, az
29670 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73  Arg, nArg);.. us
29680 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74  age:.  raw_print
29690 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
296a0 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20   %s sub-command 
296b0 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22  ?switches...?\n"
296c0 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72  , azArg[0]);.  r
296d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
296e0 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d  , "Where sub-com
296f0 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a  mands are:\n");.
29700 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29710 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69  err, "    fkey-i
29720 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65  ndexes\n");.  re
29730 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29740 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  R;.}..#if !defin
29750 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed SQLITE_OMIT_V
29760 49 52 54 55 41 4c 54 41 42 4c 45 0a 73 74 61 74  IRTUALTABLE.stat
29770 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
29780 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
29790 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
297a0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
297b0 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zSql, .  sqlite
297c0 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
297d0 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  ){.  *ppStmt = 0
297e0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
297f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29800 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29810 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
29820 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
29830 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
29840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29850 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29860 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f  tderr, "sql erro
29870 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a  r: %s (%d)\n", .
29880 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29890 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71  3_errmsg(db), sq
298a0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
298b0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
298c0 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
298d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
298e0 72 65 61 74 65 20 61 20 70 72 65 70 61 72 65 64  reate a prepared
298f0 20 73 74 61 74 65 6d 65 6e 74 20 75 73 69 6e 67   statement using
29900 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 61 72   printf-style ar
29910 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20  guments for the 
29920 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SQL..**.** This 
29930 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75 6c 64  routine is could
29940 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74 61 74   be marked "stat
29950 69 63 22 2e 20 20 42 75 74 20 69 74 20 69 73 20  ic".  But it is 
29960 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65 64 2c  not always used,
29970 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .** depending on
29980 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
29990 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74 74  tions.  By omitt
299a0 69 6e 67 20 74 68 65 20 22 73 74 61 74 69 63 22  ing the "static"
299b0 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e 75  , we avoid.** nu
299c0 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  isance compiler 
299d0 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 22  warnings about "
299e0 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f 74 20  defined but not 
299f0 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73  used"..*/.void s
29a00 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
29a10 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  f(.  sqlite3 *db
29a20 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  , .  int *pRc, .
29a30 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
29a40 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74  *ppStmt,.  const
29a50 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20   char *zFmt, .  
29a60 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  ....){.  *ppStmt
29a70 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
29a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29a90 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
29aa0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
29ab0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
29ac0 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  t);.    z = sqli
29ad0 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
29ae0 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
29af0 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20  nd(ap);.    if( 
29b00 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  z==0 ){.      *p
29b10 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
29b20 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
29b30 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
29b40 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53  (db, pRc, z, ppS
29b50 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmt);.      sqli
29b60 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
29b70 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 69 6e   }.  }.}../* Fin
29b80 61 6c 69 7a 65 20 74 68 65 20 70 72 65 70 61 72  alize the prepar
29b90 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 72 65  ed statement cre
29ba0 61 74 65 64 20 75 73 69 6e 67 20 73 68 65 6c 6c  ated using shell
29bb0 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 29 2e  PreparePrintf().
29bc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29bd0 69 6e 65 20 69 73 20 63 6f 75 6c 64 20 62 65 20  ine is could be 
29be0 6d 61 72 6b 65 64 20 22 73 74 61 74 69 63 22 2e  marked "static".
29bf0 20 20 42 75 74 20 69 74 20 69 73 20 6e 6f 74 20    But it is not 
29c00 61 6c 77 61 79 73 20 75 73 65 64 2c 0a 2a 2a 20  always used,.** 
29c10 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 63 6f 6d  depending on com
29c20 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
29c30 73 2e 20 20 42 79 20 6f 6d 69 74 74 69 6e 67 20  s.  By omitting 
29c40 74 68 65 20 22 73 74 61 74 69 63 22 2c 20 77 65  the "static", we
29c50 20 61 76 6f 69 64 0a 2a 2a 20 6e 75 69 73 61 6e   avoid.** nuisan
29c60 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
29c70 69 6e 67 73 20 61 62 6f 75 74 20 22 64 65 66 69  ings about "defi
29c80 6e 65 64 20 62 75 74 20 6e 6f 74 20 75 73 65 64  ned but not used
29c90 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68 65 6c 6c  "..*/.void shell
29ca0 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20  Finalize(.  int 
29cb0 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
29cc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
29cd0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
29ce0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
29cf0 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
29d00 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  le(pStmt);.    i
29d10 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29d20 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
29d30 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  .    if( *pRc==S
29d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29d50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29d70 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29d80 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73  , "SQL error: %s
29d90 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
29da0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
29db0 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  }.      *pRc = r
29dc0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  c;.    }.  }.}..
29dd0 2f 2a 20 52 65 73 65 74 20 74 68 65 20 70 72 65  /* Reset the pre
29de0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
29df0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 73 68  created using sh
29e00 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
29e10 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
29e20 6f 75 74 69 6e 65 20 69 73 20 63 6f 75 6c 64 20  outine is could 
29e30 62 65 20 6d 61 72 6b 65 64 20 22 73 74 61 74 69  be marked "stati
29e40 63 22 2e 20 20 42 75 74 20 69 74 20 69 73 20 6e  c".  But it is n
29e50 6f 74 20 61 6c 77 61 79 73 20 75 73 65 64 2c 0a  ot always used,.
29e60 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
29e70 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
29e80 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74 74 69  ions.  By omitti
29e90 6e 67 20 74 68 65 20 22 73 74 61 74 69 63 22 2c  ng the "static",
29ea0 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e 75 69   we avoid.** nui
29eb0 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  sance compiler w
29ec0 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 22 64  arnings about "d
29ed0 65 66 69 6e 65 64 20 62 75 74 20 6e 6f 74 20 75  efined but not u
29ee0 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68  sed"..*/.void sh
29ef0 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20  ellReset(.  int 
29f00 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
29f10 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
29f20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29f30 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
29f40 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
29f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
29f60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29f70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29f80 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
29f90 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
29fa0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29fb0 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
29fc0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
29fd0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
29fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
29ff0 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   = rc;.  }.}.#en
2a000 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 20  dif /* !defined 
2a010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a020 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2a030 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2a040 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2a050 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
2a060 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
2a070 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2a080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0c0 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63  ***.** The ".arc
2a0d0 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
2a0e0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ommand..*/./*.**
2a0f0 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72 65   Structure repre
2a100 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  senting a single
2a110 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a   ".ar" command..
2a120 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2a130 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f  t ArCommand ArCo
2a140 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72  mmand;.struct Ar
2a150 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65  Command {.  u8 e
2a160 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cmd;            
2a170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a180 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65  n AR_CMD_* value
2a190 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73   */.  u8 bVerbos
2a1a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a1b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a1c0 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20   --verbose */.  
2a1d0 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20  u8 bZip;        
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 61  /* True if the a
2a200 72 63 68 69 76 65 20 69 73 20 61 20 5a 49 50 20  rchive is a ZIP 
2a210 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b  */.  u8 bDryRun;
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a240 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75  --dry-run */.  u
2a250 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20  8 bAppend;      
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a270 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65  * True if --appe
2a280 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43  nd */.  u8 fromC
2a290 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  mdLine;         
2a2a0 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 66          /* Run f
2a2b0 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20 6f  rom -A instead o
2a2c0 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  f .archive */.  
2a2d0 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d  /* Number of com
2a300 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2a310 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54 61  /.  char *zSrcTa
2a320 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
2a330 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20      /* "sqlar", 
2a340 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29 22  "zipfile($file)"
2a350 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63   or "zip" */.  c
2a360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a380 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e  * --file argumen
2a390 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  t, or NULL */.  
2a3a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2a3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a3c0 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 61  /* --directory a
2a3d0 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
2a3e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
2a3f0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
2a400 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2a410 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  f command argume
2a420 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74  nts */.  ShellSt
2a430 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ate *p;         
2a440 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c           /* Shel
2a450 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  l state */.  sql
2a460 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a480 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  Database contain
2a490 69 6e 67 20 74 68 65 20 61 72 63 68 69 76 65 20  ing the archive 
2a4a0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  */.};../*.** Pri
2a4b0 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61  nt a usage messa
2a4c0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
2a4d0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
2a4e0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
2a4f0 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61  TE_ERROR..*/.sta
2a500 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28  tic int arUsage(
2a510 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77  FILE *f){.  show
2a520 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65 22  Help(f,"archive"
2a530 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a540 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
2a550 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
2a560 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68  r message for th
2a570 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f  e .ar command to
2a580 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
2a590 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
2a5a0 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
2a5b0 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72  nt arErrorMsg(Ar
2a5c0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
2a5d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2a5e0 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2a5f0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
2a600 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2a610 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  mt);.  z = sqlit
2a620 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
2a630 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2a640 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  ap);.  utf8_prin
2a650 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2a660 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  r: %s\n", z);.  
2a670 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64  if( pAr->fromCmd
2a680 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38  Line ){.    utf8
2a690 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a6a0 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20  "Use \"-A\" for 
2a6b0 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
2a6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38   }else{.    utf8
2a6d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a6e0 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20  "Use \".archive 
2a6f0 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72  --help\" for mor
2a700 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a  e help\n");.  }.
2a710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a720 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a730 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
2a740 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72  ** Values for Ar
2a750 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f  Command.eCmd..*/
2a760 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
2a770 43 52 45 41 54 45 20 20 20 20 20 20 20 31 0a 23  CREATE       1.#
2a780 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50  define AR_CMD_UP
2a790 44 41 54 45 20 20 20 20 20 20 20 32 0a 23 64 65  DATE       2.#de
2a7a0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45  fine AR_CMD_INSE
2a7b0 52 54 20 20 20 20 20 20 20 33 0a 23 64 65 66 69  RT       3.#defi
2a7c0 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ne AR_CMD_EXTRAC
2a7d0 54 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65  T      4.#define
2a7e0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20   AR_CMD_LIST    
2a7f0 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 41       5.#define A
2a800 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20  R_CMD_HELP      
2a810 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65     6../*.** Othe
2a820 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20  r (non-command) 
2a830 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65  switches..*/.#de
2a840 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56  fine AR_SWITCH_V
2a850 45 52 42 4f 53 45 20 20 20 20 20 37 0a 23 64 65  ERBOSE     7.#de
2a860 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46  fine AR_SWITCH_F
2a870 49 4c 45 20 20 20 20 20 20 20 20 38 0a 23 64 65  ILE        8.#de
2a880 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
2a890 49 52 45 43 54 4f 52 59 20 20 20 39 0a 23 64 65  IRECTORY   9.#de
2a8a0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41  fine AR_SWITCH_A
2a8b0 50 50 45 4e 44 20 20 20 20 20 31 30 0a 23 64 65  PPEND     10.#de
2a8c0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
2a8d0 52 59 52 55 4e 20 20 20 20 20 31 31 0a 0a 73 74  RYRUN     11..st
2a8e0 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65  atic int arProce
2a8f0 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61  ssSwitch(ArComma
2a900 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77  nd *pAr, int eSw
2a910 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  itch, const char
2a920 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *zArg){.  switc
2a930 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20  h( eSwitch ){.  
2a940 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
2a950 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  EATE:.    case A
2a960 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
2a970 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c     case AR_CMD_L
2a980 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  IST:.    case AR
2a990 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20  _CMD_UPDATE:.   
2a9a0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53   case AR_CMD_INS
2a9b0 45 52 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ERT:.    case AR
2a9c0 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20  _CMD_HELP:.     
2a9d0 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29   if( pAr->eCmd )
2a9e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2a9f0 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2aa00 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61   "multiple comma
2aa10 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
2aa20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
2aa30 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
2aa40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2aa50 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2aa60 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20  H_DRYRUN:.      
2aa70 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31  pAr->bDryRun = 1
2aa80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2aa90 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2aaa0 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
2aab0 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
2aac0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2aad0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
2aae0 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20  TCH_APPEND:.    
2aaf0 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d    pAr->bAppend =
2ab00 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   1;.      /* Fal
2ab10 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69  l thru into --fi
2ab20 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41  le */.    case A
2ab30 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20  R_SWITCH_FILE:. 
2ab40 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20       pAr->zFile 
2ab50 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
2ab60 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
2ab70 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52  _SWITCH_DIRECTOR
2ab80 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44  Y:.      pAr->zD
2ab90 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  ir = zArg;.     
2aba0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
2abb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2abc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
2abd0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
2abe0 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f   for an ".ar" co
2abf0 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c  mmand. The resul
2ac00 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
2ac10 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nto.** structure
2ac20 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f   (*pAr). SQLITE_
2ac30 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2ac40 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  f the command li
2ac50 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20  ne is parsed.** 
2ac60 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74  successfully, ot
2ac70 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
2ac80 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
2ac90 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e  ten to stderr an
2aca0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  d .** SQLITE_ERR
2acb0 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OR returned..*/.
2acc0 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72  static int arPar
2acd0 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61  seCommand(.  cha
2ace0 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad00 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
2ad10 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
2ad20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2ad30 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad50 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2ad60 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
2ad70 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
2ad80 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
2ad90 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2ada0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
2adb0 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
2adc0 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ch {.    const c
2add0 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
2ade0 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20  char cShort;.   
2adf0 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20   u8 eSwitch;.   
2ae00 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53   u8 bArg;.  } aS
2ae10 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20  witch[] = {.    
2ae20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27  { "create",    '
2ae30 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  c', AR_CMD_CREAT
2ae40 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  E,       0 },.  
2ae50 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20    { "extract",  
2ae60 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54   'x', AR_CMD_EXT
2ae70 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a  RACT,      0 },.
2ae80 20 20 20 20 7b 20 22 69 6e 73 65 72 74 22 2c 20      { "insert", 
2ae90 20 20 20 27 69 27 2c 20 41 52 5f 43 4d 44 5f 49     'i', AR_CMD_I
2aea0 4e 53 45 52 54 2c 20 20 20 20 20 20 20 30 20 7d  NSERT,       0 }
2aeb0 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20  ,.    { "list", 
2aec0 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44       't', AR_CMD
2aed0 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30  _LIST,         0
2aee0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74   },.    { "updat
2aef0 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43  e",    'u', AR_C
2af00 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20  MD_UPDATE,      
2af10 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c   0 },.    { "hel
2af20 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52  p",      'h', AR
2af30 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20  _CMD_HELP,      
2af40 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76     0 },.    { "v
2af50 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20  erbose",   'v', 
2af60 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
2af70 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  E,   0 },.    { 
2af80 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27  "file",      'f'
2af90 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  , AR_SWITCH_FILE
2afa0 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ,      1 },.    
2afb0 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27  { "append",    '
2afc0 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50  a', AR_SWITCH_AP
2afd0 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20  PEND,    1 },.  
2afe0 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c    { "directory",
2aff0 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'C', AR_SWITCH_
2b000 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a  DIRECTORY, 1 },.
2b010 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20      { "dryrun", 
2b020 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43     'n', AR_SWITC
2b030 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d  H_DRYRUN,    0 }
2b040 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77  ,.  };.  int nSw
2b050 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53  itch = sizeof(aS
2b060 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28  witch) / sizeof(
2b070 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29  struct ArSwitch)
2b080 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  ;.  struct ArSwi
2b090 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77  tch *pEnd = &aSw
2b0a0 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a  itch[nSwitch];..
2b0b0 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b    if( nArg<=1 ){
2b0c0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2b0d0 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67 20  (stderr, "Wrong 
2b0e0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
2b0f0 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22 29  nts.  Usage:\n")
2b100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55  ;.    return arU
2b110 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20  sage(stderr);.  
2b120 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
2b130 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  *z = azArg[1];. 
2b140 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
2b150 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61   ){.      /* Tra
2b160 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b  ditional style [
2b170 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tar] invocation 
2b180 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
2b190 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d        int iArg =
2b1a0 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   2;.      for(i=
2b1b0 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
2b1c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b1d0 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
2b1e0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
2b1f0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
2b200 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
2b210 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
2b220 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
2b230 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d          if( z[i]
2b240 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29  ==pOpt->cShort )
2b250 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b260 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
2b270 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
2b280 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2b290 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
2b2a0 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
2b2b0 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
2b2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b2d0 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
2b2e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b2f0 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
2b300 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b310 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2b320 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
2b330 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
2b340 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  %c",z[i]);.     
2b350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b360 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 41   zArg = azArg[iA
2b370 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d  rg++];.        }
2b380 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50  .        if( arP
2b390 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
2b3a0 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
2b3b0 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
2b3c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
2b3e0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
2b3f0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  g;.      if( pAr
2b400 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ->nArg>0 ){.    
2b410 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2b420 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
2b430 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b440 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74  {.      /* Non-t
2b450 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63  raditional invoc
2b460 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2b470 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20 66  nt iArg;.      f
2b480 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67 3c  or(iArg=1; iArg<
2b490 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20  nArg; iArg++){. 
2b4a0 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
2b4b0 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b        z = azArg[
2b4c0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 69  iArg];.        i
2b4d0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
2b4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2b4f0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
2b500 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61 72  nd line words ar
2b510 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
2b520 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nts. */.        
2b530 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
2b540 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
2b550 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
2b560 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
2b570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b590 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
2b5a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ;..        if( z
2b5b0 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]!='-' ){.    
2b5c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2b5d0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72         /* One or
2b5e0 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74 69   more short opti
2b5f0 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ons */.         
2b600 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
2b610 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2b620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2b630 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
2b640 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
2b650 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
2b660 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
2b670 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
2b680 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2b6a0 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
2b6b0 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
2b6c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
2b6e0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
2b6f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2b700 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2b710 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2b720 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
2b730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b750 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  Opt->bArg ){.   
2b760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2b770 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  <(n-1) ){.      
2b780 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
2b790 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20   &z[i+1];.      
2b7a0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b            i = n;
2b7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b7c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b7d0 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
2b7e0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b800 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2b810 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  pAr, "option req
2b820 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
2b830 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b860 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
2b870 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
2b880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b890 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b8a0 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2b8b0 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65  tch(pAr, pOpt->e
2b8c0 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
2b8d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2b8e0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
2b8f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2b900 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b  f( z[2]=='\0' ){
2b910 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2b920 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63  -- option, indic
2b930 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72  ating that all r
2b940 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64  emaining command
2b950 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20   line words.    
2b960 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d        ** are com
2b970 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
2b980 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41   */.          pA
2b990 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
2b9a0 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  g[iArg+1];.     
2b9b0 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
2b9c0 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20   nArg-iArg-1;.  
2b9d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b9e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b9f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e          /* A lon
2ba00 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
2ba10 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ba20 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20   *zArg = 0;     
2ba30 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
2ba40 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20  ent for option, 
2ba50 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20  if any */.      
2ba60 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
2ba70 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tch *pMatch = 0;
2ba80 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e        /* Matchin
2ba90 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
2baa0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2bab0 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20  witch *pOpt;    
2bac0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2bad0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
2bae0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
2baf0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
2bb00 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
2bb10 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2bb20 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d  r *zLong = pOpt-
2bb30 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20  >zLong;.        
2bb40 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73      if( (n-2)<=s
2bb50 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26  trlen30(zLong) &
2bb60 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32  & 0==memcmp(&z[2
2bb70 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29  ], zLong, n-2) )
2bb80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bb90 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20  if( pMatch ){.  
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2bbb0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2bbc0 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20  pAr, "ambiguous 
2bbd0 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a  option: %s",z);.
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2bbf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2bc00 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f       pMatch = pO
2bc10 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
2bc20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bc30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
2bc40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
2bc50 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tch==0 ){.      
2bc60 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2bc70 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
2bc80 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
2bc90 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  n: %s", z);.    
2bca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bcb0 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62 41    if( pMatch->bA
2bcc0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2bcd0 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72    if( iArg>=(nAr
2bce0 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
2bcf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
2bd00 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
2bd10 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
2bd20 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20   argument: %s", 
2bd30 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
2bd40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41  }.            zA
2bd50 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72  rg = azArg[++iAr
2bd60 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g];.          }.
2bd70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72            if( ar
2bd80 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
2bd90 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74  r, pMatch->eSwit
2bda0 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
2bdb0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2bdc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bdd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2bde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bdf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2be00 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2be10 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65   that all argume
2be20 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41  nts within the A
2be30 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d  rCommand.azArg[]
2be40 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20  .** array refer 
2be50 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65  to archive membe
2be60 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d  rs, as for the -
2be70 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69  -extract or --li
2be80 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a  st commands. .**
2be90 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20   It checks that 
2bea0 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65  each of them are
2beb0 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79   present. If any
2bec0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2bed0 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e  is not.** presen
2bee0 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65  t in the archive
2bef0 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72  , an error is pr
2bf00 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20  inted to stderr 
2bf10 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  and an error.** 
2bf20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f  code returned. O
2bf30 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
2bf40 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d   specified argum
2bf50 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74  ents are present
2bf60 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69   in.** the archi
2bf70 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ve, SQLITE_OK is
2bf80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2bf90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2bfa0 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69  trips any traili
2bfb0 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72  ng '/' character
2bfc0 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75  s from each argu
2bfd0 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73  ment..** This is
2bfe0 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
2bff0 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61   the way the [ta
2c000 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73  r] command seems
2c010 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c   to work on.** L
2c020 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inux..*/.static 
2c030 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69  int arCheckEntri
2c040 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  es(ArCommand *pA
2c050 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2c060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2c070 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20  pAr->nArg ){.   
2c080 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73   int i, j;.    s
2c090 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65  qlite3_stmt *pTe
2c0a0 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65  st = 0;..    she
2c0b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
2c0c0 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
2c0d0 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53  Test,.        "S
2c0e0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
2c0f0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e  %s WHERE name=$n
2c100 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70  ame", .        p
2c110 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20  Ar->zSrcTable.  
2c120 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c    );.    j = sql
2c130 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2c140 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c  ter_index(pTest,
2c150 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66   "$name");.    f
2c160 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
2c170 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
2c180 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2c190 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d    char *z = pAr-
2c1a0 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
2c1b0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
2c1c0 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  0(z);.      int 
2c1d0 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  bOk = 0;.      w
2c1e0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
2c1f0 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a  -1]=='/' ) n--;.
2c200 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30        z[n] = '\0
2c210 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
2c220 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74  _bind_text(pTest
2c230 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  , j, z, -1, SQLI
2c240 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
2c250 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
2c260 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2c270 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Test) ){.       
2c280 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOk = 1;.      
2c290 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73  }.      shellRes
2c2a0 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  et(&rc, pTest);.
2c2b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c2c0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d  LITE_OK && bOk==
2c2d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
2c2e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2c2f0 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61   "not found in a
2c300 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a  rchive: %s\n", z
2c310 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2c320 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c340 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
2c350 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20  c, pTest);.  }. 
2c360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c370 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48  *.** Format a WH
2c380 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2c390 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69  can be used agai
2c3a0 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20  nst the "sqlar" 
2c3b0 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e  table to.** iden
2c3c0 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65  tify all archive
2c3d0 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61   members that ma
2c3e0 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  tch the command 
2c3f0 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a  arguments held.*
2c400 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61  * in (*pAr). Lea
2c410 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c  ve this WHERE cl
2c420 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72  ause in (*pzWher
2c430 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  e) before return
2c440 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ing..** The call
2c450 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2c460 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79  e for eventually
2c470 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
2c480 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e  _free() on.** an
2c490 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57  y non-NULL (*pzW
2c4a0 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a  here) value..*/.
2c4b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68  static void arWh
2c4c0 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74  ereClause(.  int
2c4d0 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d   *pRc, .  ArComm
2c4e0 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61  and *pAr, .  cha
2c4f0 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20  r **pzWhere     
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c510 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63  OUT: New WHERE c
2c520 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68  lause */.){.  ch
2c530 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
2c540 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
2c550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c560 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b   pAr->nArg==0 ){
2c570 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20  .      zWhere = 
2c580 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c590 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "1");.    }else{
2c5a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2c5b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c5c0 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20  zSep = "";.     
2c5d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2c5e0 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nArg; i++){.   
2c5f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2c600 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b  *z = pAr->azArg[
2c610 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65  i];.        zWhe
2c620 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
2c630 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
2c640 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71  "%z%s name = '%q
2c650 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65  ' OR substr(name
2c660 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c  ,1,%d) = '%q/'",
2c670 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65   .          zWhe
2c680 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72  re, zSep, z, str
2c690 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20  len30(z)+1, z.  
2c6a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c6b0 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29   if( zWhere==0 )
2c6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 63  {.          *pRc
2c6d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c6e0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2c6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c700 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20      zSep = " OR 
2c710 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
2c720 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20  .  }.  *pzWhere 
2c730 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a  = zWhere;.}../*.
2c740 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2c750 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20  n of .ar "lisT" 
2c760 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
2c770 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f  tic int arListCo
2c780 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20  mmand(ArCommand 
2c790 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pAr){.  const c
2c7a0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c  har *zSql = "SEL
2c7b0 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57  ECT %s FROM %s W
2c7c0 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e  HERE %s"; .  con
2c7d0 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b  st char *azCols[
2c7e0 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22  ] = {.    "name"
2c7f0 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f  ,.    "lsmode(mo
2c800 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d  de), sz, datetim
2c810 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70  e(mtime, 'unixep
2c820 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d  och'), name".  }
2c830 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ;..  char *zWher
2c840 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2c850 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
2c860 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2c870 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65   = arCheckEntrie
2c880 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72  s(pAr);.  arWher
2c890 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72  eClause(&rc, pAr
2c8a0 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73  , &zWhere);..  s
2c8b0 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2c8c0 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2c8d0 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43  &pSql, zSql, azC
2c8e0 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73  ols[pAr->bVerbos
2c8f0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
2c900 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53           pAr->zS
2c910 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29  rcTable, zWhere)
2c920 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72  ;.  if( pAr->bDr
2c930 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38  yRun ){.    utf8
2c940 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2c950 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
2c960 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b  ite3_sql(pSql));
2c970 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2c980 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2c990 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2c9a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2c9b0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sql) ){.      if
2c9c0 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20  ( pAr->bVerbose 
2c9d0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2c9e0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2c9f0 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20 25  ut, "%s % 10d  %
2ca00 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s  %s\n",.      
2ca10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2ca20 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2ca30 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2ca40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2ca50 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20  nt(pSql, 1), .  
2ca60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ca70 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2ca80 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20  ql, 2),.        
2ca90 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
2caa0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
2cab0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2cac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cad0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2cae0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2caf0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2cb00 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
2cb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cb20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69   }.  shellFinali
2cb30 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
2cb40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
2cb50 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
2cb60 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
2cb70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2cb80 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
2cb90 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
2cba0 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
2cbb0 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
2cbc0 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
2cbd0 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20  char *zSql1 = . 
2cbe0 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20     "SELECT ".   
2cbf0 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65   " ($dir || name
2cc00 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66  ),".    " writef
2cc10 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d  ile(($dir || nam
2cc20 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74  e), %s, mode, mt
2cc30 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d  ime) ".    "FROM
2cc40 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41   %s WHERE (%s) A
2cc50 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c  ND (data IS NULL
2cc60 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30   OR $dirOnly = 0
2cc70 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61 6d  )".    " AND nam
2cc80 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e 5b  e NOT GLOB '*..[
2cc90 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e 73  /\\]*'";..  cons
2cca0 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61 41  t char *azExtraA
2ccb0 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22 73  rg[] = { .    "s
2ccc0 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73 28  qlar_uncompress(
2ccd0 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20 20  data, sz)",.    
2cce0 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20 73  "data".  };..  s
2ccf0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
2cd00 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
2cd10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
2cd20 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20  har *zDir = 0;. 
2cd30 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
2cd40 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  0;.  int i, j;..
2cd50 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2cd60 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  s are specified,
2cd70 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 79   check that they
2cd80 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
2cd90 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
2cda0 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20 70  archive before p
2cdb0 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66  roceeding. And f
2cdc0 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45  ormulate a WHERE
2cdd0 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20   clause to.  ** 
2cde0 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a  match them.  */.
2cdf0 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
2ce00 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72  tries(pAr);.  ar
2ce10 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
2ce20 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
2ce30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ce40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2ce50 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20 20  pAr->zDir ){.   
2ce60 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
2ce70 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c  3_mprintf("%s/",
2ce80 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
2ce90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44   }else{.      zD
2cea0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
2ceb0 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d 0a  intf("");.    }.
2cec0 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
2ced0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
2cee0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65 6c  MEM;.  }..  shel
2cef0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
2cf00 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
2cf10 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20  ql, zSql1, .    
2cf20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41 72    azExtraArg[pAr
2cf30 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a 53  ->bZip], pAr->zS
2cf40 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 0a  rcTable, zWhere.
2cf50 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
2cf60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cf70 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
2cf80 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2cf90 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29 3b  x(pSql, "$dir");
2cfa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
2cfb0 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c 20  d_text(pSql, j, 
2cfc0 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zDir, -1, SQLITE
2cfd0 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f  _STATIC);..    /
2cfe0 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43 54  * Run the SELECT
2cff0 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63 65   statement twice
2d000 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
2d010 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69 73  , writefile() is
2d020 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66   called.    ** f
2d030 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d  or all archive m
2d040 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f 75  embers that shou
2d050 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64 2e  ld be extracted.
2d060 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d 65   The second time
2d070 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f  ,.    ** only fo
2d080 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  r the directorie
2d090 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
2d0a0 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  se the timestamp
2d0b0 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78 74  s for.    ** ext
2d0c0 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72 69  racted directori
2d0d0 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  es must be reset
2d0e0 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65 20   after they are 
2d0f0 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20 20  populated (as.  
2d100 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67 20    ** populating 
2d110 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68 65  them changes the
2d120 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a 2f   timestamp).  */
2d130 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2d140 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  2; i++){.      j
2d150 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
2d160 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
2d170 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79 22  pSql, "$dirOnly"
2d180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d190 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
2d1a0 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  j, i);.      if(
2d1b0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
2d1c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2d1d0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2d1e0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
2d1f0 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
2d200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d210 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2d220 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2d230 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2d240 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
2d250 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
2d260 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  && pAr->bVerbose
2d270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d280 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2d290 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
2d2a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2d2b0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
2d2c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d2e0 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26      shellReset(&
2d2f0 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d  rc, pSql);.    }
2d300 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
2d310 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
2d320 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
2d330 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69  ee(zDir);.  sqli
2d340 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
2d350 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d360 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
2d370 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
2d380 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64 6f   zSql.  Or if do
2d390 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c 20  ing a --dryrun, 
2d3a0 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74 20  merely print it 
2d3b0 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  out..*/.static i
2d3c0 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72 43  nt arExecSql(ArC
2d3d0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
2d3e0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
2d3f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
2d400 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
2d410 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d420 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2d430 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
2d440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
2d460 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
2d470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2d480 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c  ec(pAr->db, zSql
2d490 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
2d4a0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
2d4b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d4c0 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f 52  f(stdout, "ERROR
2d4d0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
2d4e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2d4f0 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ee(zErr);.    }.
2d500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d510 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
2d520 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
2d530 20 22 63 72 65 61 74 65 22 2c 20 22 69 6e 73 65   "create", "inse
2d540 72 74 22 2c 20 61 6e 64 20 22 75 70 64 61 74 65  rt", and "update
2d550 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
2d560 2a 20 20 20 20 20 63 72 65 61 74 65 20 20 20 20  *     create    
2d570 2d 3e 20 20 20 20 20 43 72 65 61 74 65 20 61 20  ->     Create a 
2d580 6e 65 77 20 53 51 4c 20 61 72 63 68 69 76 65 0a  new SQL archive.
2d590 2a 2a 20 20 20 20 20 69 6e 73 65 72 74 20 20 20  **     insert   
2d5a0 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20 6f   ->     Insert o
2d5b0 72 20 72 65 69 6e 73 65 72 74 20 61 6c 6c 20 66  r reinsert all f
2d5c0 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a 20 20  iles listed.**  
2d5d0 20 20 20 75 70 64 61 74 65 20 20 20 20 2d 3e 20     update    -> 
2d5e0 20 20 20 20 49 6e 73 65 72 74 20 66 69 6c 65 73      Insert files
2d5f0 20 74 68 61 74 20 68 61 76 65 20 63 68 61 6e 67   that have chang
2d600 65 64 20 6f 72 20 74 68 61 74 20 77 65 72 65 20  ed or that were 
2d610 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  not.**          
2d620 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
2d630 69 6f 75 73 6c 79 20 69 6e 20 74 68 65 20 61 72  iously in the ar
2d640 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43 72 65 61  chive.**.** Crea
2d650 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  te the "sqlar" t
2d660 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2d670 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  base if it does 
2d680 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2d690 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65  t..** Then add e
2d6a0 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ach file in the 
2d6b0 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74  azFile[] array t
2d6c0 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20 44  o the archive. D
2d6d0 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72  irectories.** ar
2d6e0 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69 76  e added recursiv
2d6f0 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ely. If argument
2d700 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e   bVerbose is non
2d710 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65  -zero, a message
2d720 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f   is.** printed o
2d730 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63  n stdout for eac
2d740 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e  h file archived.
2d750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61 74  .**.** The creat
2d760 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65  e command is the
2d770 20 73 61 6d 65 20 61 73 20 75 70 64 61 74 65 2c   same as update,
2d780 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
2d790 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69  drops.** any exi
2d7a0 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74 61  sting "sqlar" ta
2d7b0 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e  ble before begin
2d7c0 6e 69 6e 67 2e 20 20 54 68 65 20 22 69 6e 73 65  ning.  The "inse
2d7d0 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 61  rt" command.** a
2d7e0 6c 77 61 79 73 20 6f 76 65 72 77 72 69 74 65 73  lways overwrites
2d7f0 20 65 76 65 72 79 20 66 69 6c 65 20 6e 61 6d 65   every file name
2d800 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
2d810 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20 61 73 0a  -line, where as.
2d820 2a 2a 20 22 75 70 64 61 74 65 22 20 6f 6e 6c 79  ** "update" only
2d830 20 6f 76 65 72 77 72 69 74 65 73 20 69 66 20 74   overwrites if t
2d840 68 65 20 73 69 7a 65 20 6f 72 20 6d 74 69 6d 65  he size or mtime
2d850 20 6f 72 20 6d 6f 64 65 20 68 61 73 20 63 68 61   or mode has cha
2d860 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
2d870 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72 55 70  int arCreateOrUp
2d880 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41  dateCommand(.  A
2d890 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20  rCommand *pAr,  
2d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d8b0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2d8c0 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20  nts and options 
2d8d0 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65  */.  int bUpdate
2d8e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d8f0 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66 6f 72       /* true for
2d900 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 2a 2f 0a   a --create. */.
2d910 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66 43 68 61    int bOnlyIfCha
2d920 6e 67 65 64 20 20 20 20 20 20 20 20 20 20 20 20  nged            
2d930 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65    /* Only update
2d940 20 69 66 20 66 69 6c 65 20 68 61 73 20 63 68 61   if file has cha
2d950 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  nged */.){.  con
2d960 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
2d970 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
2d980 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2d990 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
2d9a0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
2d9b0 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
2d9c0 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
2d9d0 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
2d9e0 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
2d9f0 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
2da00 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
2da10 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
2da20 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2da30 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
2da40 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
2da50 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da70 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
2da80 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
2da90 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
2daa0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
2dab0 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
2dac0 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
2dad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
2dae0 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
2daf0 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
2db00 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
2db10 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d  *zInsertFmt[2] =
2db20 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45   {.     "REPLACE
2db30 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
2db40 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61  de,mtime,sz,data
2db50 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c  )\n".     "  SEL
2db60 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ECT\n".     "   
2db70 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20   %s,\n".     "  
2db80 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20    mode,\n".     
2db90 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20  "    mtime,\n". 
2dba0 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75      "    CASE su
2dbb0 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65  bstr(lsmode(mode
2dbc0 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22  ),1,1)\n".     "
2dbd0 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54        WHEN '-' T
2dbe0 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29  HEN length(data)
2dbf0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
2dc00 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c  WHEN 'd' THEN 0\
2dc10 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45  n".     "      E
2dc20 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20  LSE -1 END,\n". 
2dc30 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63      "    sqlar_c
2dc40 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22  ompress(data)\n"
2dc50 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73  .     "  FROM fs
2dc60 64 69 72 28 25 51 2c 25 51 29 20 41 53 20 64 69  dir(%Q,%Q) AS di
2dc70 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  sk\n".     "  WH
2dc80 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
2dc90 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 25   NOT LIKE '?%%'%
2dca0 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20 20 20 20  s;".     ,.     
2dcb0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
2dcc0 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
2dcd0 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
2dce0 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
2dcf0 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
2dd00 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
2dd10 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
2dd20 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64 61  \n".     "    da
2dd30 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  ta\n".     "  FR
2dd40 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 20  OM fsdir(%Q,%Q) 
2dd50 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20  AS disk\n".     
2dd60 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
2dd70 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
2dd80 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b 0a 20 20  ?%%'%s;".  };.  
2dd90 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
2ddc0 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b   through azFile[
2ddd0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2de00 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
2de10 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
2de20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
2de30 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  L table into whi
2de40 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ch to insert */.
2de50 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2de60 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a  char zTemp[50];.
2de70 20 20 63 68 61 72 20 2a 7a 45 78 69 73 74 73 20    char *zExists 
2de80 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65 63 53 71  = 0;..  arExecSq
2de90 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20 70  l(pAr, "PRAGMA p
2dea0 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a  age_size=512");.
2deb0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2dec0 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54  (pAr, "SAVEPOINT
2ded0 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63   ar;");.  if( rc
2dee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2def0 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70  turn rc;.  zTemp
2df00 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28 20  [0] = 0; .  if( 
2df10 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20  pAr->bZip ){.   
2df20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2df30 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75  he zipfile virtu
2df40 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65 63  al table, if nec
2df50 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
2df60 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a  ( pAr->zFile ){.
2df70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
2df80 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73 71  nt64 r;.      sq
2df90 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
2dfa0 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a  (sizeof(r),&r);.
2dfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2dfc0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
2dfd0 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25  emp),zTemp,"zip%
2dfe0 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20  016llx",r);.    
2dff0 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a    zTab = zTemp;.
2e000 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
2e010 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2e020 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56         "CREATE V
2e030 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d  IRTUAL TABLE tem
2e040 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66 69  p.%s USING zipfi
2e050 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20 20  le(%Q)",.       
2e060 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69    zTab, pAr->zFi
2e070 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  le.      );.    
2e080 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2e090 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
2e0a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e0b0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
2e0c0 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 22  {.      zTab = "
2e0d0 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  zip";.    }.  }e
2e0e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
2e0f0 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
2e100 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f   for an SQLAR */
2e110 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c  .    zTab = "sql
2e120 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55 70  ar";.    if( bUp
2e130 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  date==0 ){.     
2e140 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2e150 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20  pAr, zDrop);.   
2e160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e170 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2e180 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  ar_transaction;.
2e190 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61      }.    rc = a
2e1a0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43  rExecSql(pAr, zC
2e1b0 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  reate);.  }.  if
2e1c0 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67 65 64  ( bOnlyIfChanged
2e1d0 20 29 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20   ){.    zExists 
2e1e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e1f0 66 28 0a 20 20 20 20 20 20 22 20 41 4e 44 20 4e  f(.      " AND N
2e200 4f 54 20 45 58 49 53 54 53 28 22 0a 20 20 20 20  OT EXISTS(".    
2e210 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20        "SELECT 1 
2e220 46 52 4f 4d 20 25 73 20 41 53 20 6d 65 6d 22 0a  FROM %s AS mem".
2e230 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2e240 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69 73 6b 2e  E mem.name=disk.
2e250 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20  name".          
2e260 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69 6d 65 3d  " AND mem.mtime=
2e270 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20 20 20 20  disk.mtime".    
2e280 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e        " AND mem.
2e290 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64 65 29 22  mode=disk.mode)"
2e2a0 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  , zTab);.  }else
2e2b0 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20 3d 20  {.    zExists = 
2e2c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2e2d0 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  "");.  }.  if( z
2e2e0 45 78 69 73 74 73 3d 3d 30 20 29 20 72 63 20 3d  Exists==0 ) rc =
2e2f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2e300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2e310 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2e320 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2e330 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20    char *zSql2 = 
2e340 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2e350 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e  zInsertFmt[pAr->
2e360 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20  bZip], zTab,.   
2e370 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
2e380 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
2e390 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
2e3a0 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
2e3b0 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
2e3c0 7a 44 69 72 2c 20 7a 45 78 69 73 74 73 29 3b 0a  zDir, zExists);.
2e3d0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2e3e0 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a  ql(pAr, zSql2);.
2e3f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e400 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64  (zSql2);.  }.end
2e410 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a  _ar_transaction:
2e420 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2e440 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
2e450 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61  , "ROLLBACK TO a
2e460 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22 2c  r; RELEASE ar;",
2e470 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
2e480 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45  se{.    rc = arE
2e490 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c  xecSql(pAr, "REL
2e4a0 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 20 20  EASE ar;");.    
2e4b0 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 26 26  if( pAr->bZip &&
2e4c0 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20   pAr->zFile ){. 
2e4d0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2e4e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f  te3_mprintf("DRO
2e4f0 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 65  P TABLE %s", zTe
2e500 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45 78 65  mp);.      arExe
2e510 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b  cSql(pAr, zSql);
2e520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e530 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2e540 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2e550 72 65 65 28 7a 45 78 69 73 74 73 29 3b 0a 20 20  ree(zExists);.  
2e560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e570 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2e580 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f 74 20  on of ".ar" dot 
2e590 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
2e5a0 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d  ic int arDotComm
2e5b0 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
2e5c0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
2e5d0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2e5e0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
2e5f0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d  te */.  int from
2e600 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20 20 20  CmdLine,        
2e610 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e620 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69  if -A command-li
2e630 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e  ne option, not .
2e640 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72  ar cmd */.  char
2e650 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
2e660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2e670 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2e680 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
2e690 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2e6a0 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e6c0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2e6d0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
2e6e0 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63  ){.  ArCommand c
2e6f0 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  md;.  int rc;.  
2e700 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20  memset(&cmd, 0, 
2e710 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20  sizeof(cmd));.  
2e720 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20  cmd.fromCmdLine 
2e730 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20  = fromCmdLine;. 
2e740 20 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d   rc = arParseCom
2e750 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67  mand(azArg, nArg
2e760 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72  , &cmd);.  if( r
2e770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e780 20 20 20 20 69 6e 74 20 65 44 62 54 79 70 65 20      int eDbType 
2e790 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
2e7a0 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d  PEC;.    cmd.p =
2e7b0 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64   pState;.    cmd
2e7c0 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  .db = pState->db
2e7d0 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46  ;.    if( cmd.zF
2e7e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62  ile ){.      eDb
2e7f0 54 79 70 65 20 3d 20 64 65 64 75 63 65 44 61 74  Type = deduceDat
2e800 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46  abaseType(cmd.zF
2e810 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ile, 1);.    }el
2e820 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70  se{.      eDbTyp
2e830 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e  e = pState->open
2e840 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mode;.    }.    
2e850 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45  if( eDbType==SHE
2e860 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
2e870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
2e880 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58  .eCmd==AR_CMD_EX
2e890 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d  TRACT || cmd.eCm
2e8a0 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29  d==AR_CMD_LIST )
2e8b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6d  {.        if( cm
2e8c0 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  d.zFile==0 ){.  
2e8d0 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63          cmd.zSrc
2e8e0 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  Table = sqlite3_
2e8f0 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a  mprintf("zip");.
2e900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e910 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72           cmd.zSr
2e920 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2e930 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c  _mprintf("zipfil
2e940 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c  e(%Q)", cmd.zFil
2e950 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2e960 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
2e970 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65  bZip = 1;.    }e
2e980 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c  lse if( cmd.zFil
2e990 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  e ){.      int f
2e9a0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
2e9b0 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44  cmd.bAppend ) eD
2e9c0 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
2e9d0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
2e9e0 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
2e9f0 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  ==AR_CMD_CREATE 
2ea00 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
2ea10 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20 20 20 20  CMD_INSERT .    
2ea20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64 2e 65 43         || cmd.eC
2ea30 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
2ea40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  E ){.        fla
2ea50 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
2ea60 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2ea70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
2ea80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ea90 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
2eaa0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2eab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2eac0 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20  cmd.db = 0;.    
2ead0 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75    if( cmd.bDryRu
2eae0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  n ){.        utf
2eaf0 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
2eb00 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64  >out, "-- open d
2eb10 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e  atabase '%s'%s\n
2eb20 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20  ", cmd.zFile,.  
2eb30 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79             eDbTy
2eb40 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  pe==SHELL_OPEN_A
2eb50 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69  PPENDVFS ? " usi
2eb60 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20  ng 'apndvfs'" : 
2eb70 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "");.      }.   
2eb80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2eb90 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c  open_v2(cmd.zFil
2eba0 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67  e, &cmd.db, flag
2ebb0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2ebc0 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2ebd0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2ebe0 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b   "apndvfs" : 0);
2ebf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ec00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ec10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ec20 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
2ec30 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25  open file: %s (%
2ec40 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s)\n", .        
2ec50 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73      cmd.zFile, s
2ec60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d  qlite3_errmsg(cm
2ec70 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b  d.db).        );
2ec80 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2ec90 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
2eca0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2ecb0 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
2ecc0 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  cmd.db, 0, 0);. 
2ecd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c       sqlite3_sql
2ece0 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20  ar_init(cmd.db, 
2ecf0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2ed00 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2ed10 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68  tion(cmd.db, "sh
2ed20 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20  ell_putsnl", 1, 
2ed30 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64  SQLITE_UTF8, cmd
2ed40 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .p,.            
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed60 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
2ed70 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20   0, 0);..    }. 
2ed80 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54     if( cmd.zSrcT
2ed90 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62  able==0 && cmd.b
2eda0 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43  Zip==0 && cmd.eC
2edb0 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20  md!=AR_CMD_HELP 
2edc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
2edd0 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd!=AR_CMD_CR
2ede0 45 41 54 45 0a 20 20 20 20 20 20 20 26 26 20 73  EATE.       && s
2edf0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
2ee00 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64  umn_metadata(cmd
2ee10 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e  .db,0,"sqlar","n
2ee20 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a  ame",0,0,0,0,0).
2ee30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ee40 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ee50 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20 64  err, "database d
2ee60 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
2ee70 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65  an 'sqlar' table
2ee80 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
2ee90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2eea0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2eeb0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
2eec0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
2eed0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2eee0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c  te3_mprintf("sql
2eef0 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ar");.    }..   
2ef00 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d   switch( cmd.eCm
2ef10 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  d ){.      case 
2ef20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20  AR_CMD_CREATE:. 
2ef30 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
2ef40 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
2ef50 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20 30 29 3b  and(&cmd, 0, 0);
2ef60 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2ef70 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2ef80 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
2ef90 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72 61      rc = arExtra
2efa0 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  ctCommand(&cmd);
2efb0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2efc0 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2efd0 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20  MD_LIST:.       
2efe0 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d   rc = arListComm
2eff0 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20  and(&cmd);.     
2f000 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2f010 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
2f020 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73 61  P:.        arUsa
2f030 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b  ge(pState->out);
2f040 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2f050 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2f060 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 20  MD_INSERT:.     
2f070 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65     rc = arCreate
2f080 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2f090 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  &cmd, 1, 0);.   
2f0a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2f0b0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2f0c0 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e      assert( cmd.
2f0d0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
2f0e0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ATE );.        r
2f0f0 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70  c = arCreateOrUp
2f100 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  dateCommand(&cmd
2f110 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
2f120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f130 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64  }.end_ar_command
2f140 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21 3d  :.  if( cmd.db!=
2f150 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20  pState->db ){.  
2f160 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e 64    close_db(cmd.d
2f170 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
2f180 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63 54  3_free(cmd.zSrcT
2f190 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  able);..  return
2f1a0 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66   rc;.}./* End of
2f1b0 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22 20   the ".archive" 
2f1c0 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  or ".ar" command
2f1d0 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   logic.*********
2f1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2f230 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
2f240 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f250 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
2f260 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
2f270 4c 49 42 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  LIB) */..#if !de
2f280 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2f290 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
2f2a0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
2f2b0 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
2f2c0 56 54 41 42 29 0a 2f 2a 0a 2a 2a 20 49 66 20 28  VTAB)./*.** If (
2f2d0 2a 70 52 63 29 20 69 73 20 6e 6f 74 20 53 51 4c  *pRc) is not SQL
2f2e0 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2f2f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f300 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2f310 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
2f320 2c 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  , the SQL statem
2f330 65 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74  ent or statement
2f340 73 20 69 6e 20 7a 53 71 6c 20 61 72 65 20 65 78  s in zSql are ex
2f350 65 63 75 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ecuted using.** 
2f360 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f370 69 6f 6e 20 64 62 20 61 6e 64 20 74 68 65 20 65  ion db and the e
2f380 72 72 6f 72 20 63 6f 64 65 20 77 72 69 74 74 65  rror code writte
2f390 6e 20 74 6f 20 2a 70 52 63 20 62 65 66 6f 72 65  n to *pRc before
2f3a0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
2f3b0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  n returns..*/.st
2f3c0 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45  atic void shellE
2f3d0 78 65 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xec(sqlite3 *db,
2f3e0 20 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74   int *pRc, const
2f3f0 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
2f400 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20  int rc = *pRc;. 
2f410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f420 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  OK ){.    char *
2f430 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  zErr = 0;.    rc
2f440 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f450 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
2f460 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
2f470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f480 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f490 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
2f4a0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
2f4b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
2f4c0 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  Rc = rc;.  }.}..
2f4d0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 68 65 6c 6c  /*.** Like shell
2f4e0 45 78 65 63 28 29 2c 20 65 78 63 65 70 74 20 74  Exec(), except t
2f4f0 68 61 74 20 7a 46 6d 74 20 69 73 20 61 20 70 72  hat zFmt is a pr
2f500 69 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72  intf() style for
2f510 6d 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  mat string..*/.s
2f520 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f530 45 78 65 63 50 72 69 6e 74 66 28 73 71 6c 69 74  ExecPrintf(sqlit
2f540 65 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63  e3 *db, int *pRc
2f550 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2f560 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72  mt, ...){.  char
2f570 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a   *z = 0;.  if( *
2f580 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2f590 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
2f5a0 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
2f5b0 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
2f5c0 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
2f5d0 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
2f5e0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2f5f0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
2f600 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
2f610 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2f620 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 45  se{.      shellE
2f630 78 65 63 28 64 62 2c 20 70 52 63 2c 20 7a 29 3b  xec(db, pRc, z);
2f640 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f650 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
2f660 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63  }../*.** If *pRc
2f670 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
2f680 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2f690 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2f6a0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
2f6b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  * Otherwise, an 
2f6c0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2f6d0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 7a 65 72  to allocate, zer
2f6e0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  o and return a p
2f6f0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 20 62  ointer.** to a b
2f700 75 66 66 65 72 20 6e 42 79 74 65 20 62 79 74 65  uffer nByte byte
2f710 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 20 61 6e  s in size. If an
2f720 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
2f730 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 0a 2a  s, *pRc is set.*
2f740 2a 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * to SQLITE_NOME
2f750 4d 20 61 6e 64 20 4e 55 4c 4c 20 72 65 74 75 72  M and NULL retur
2f760 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
2f770 6f 69 64 20 2a 73 68 65 6c 6c 4d 61 6c 6c 6f 63  oid *shellMalloc
2f780 28 69 6e 74 20 2a 70 52 63 2c 20 73 71 6c 69 74  (int *pRc, sqlit
2f790 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
2f7a0 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20  .  void *pRet = 
2f7b0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
2f7c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f7d0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pRet = sqlite3_m
2f7e0 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
2f7f0 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
2f800 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
2f810 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2f830 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
2f840 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
2f850 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
2f860 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63  }../*.** If *pRc
2f870 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
2f880 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2f890 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2f8a0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
2f8b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 46 6d  * Otherwise, zFm
2f8c0 74 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  t is treated as 
2f8d0 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65  a printf() style
2f8e0 20 73 74 72 69 6e 67 2e 20 54 68 65 20 72 65 73   string. The res
2f8f0 75 6c 74 20 6f 66 0a 2a 2a 20 66 6f 72 6d 61 74  ult of.** format
2f900 74 69 6e 67 20 69 74 20 61 6c 6f 6e 67 20 77 69  ting it along wi
2f910 74 68 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  th any trailing 
2f920 61 72 67 75 6d 65 6e 74 73 20 69 73 20 77 72 69  arguments is wri
2f930 74 74 65 6e 20 69 6e 74 6f 20 61 20 0a 2a 2a 20  tten into a .** 
2f940 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 20  buffer obtained 
2f950 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2f960 6c 6f 63 28 29 2c 20 61 6e 64 20 70 6f 69 6e 74  loc(), and point
2f970 65 72 20 74 6f 20 77 68 69 63 68 20 69 73 20 72  er to which is r
2f980 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49 74 20 69  eturned..** It i
2f990 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
2f9a0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
2f9b0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
2f9c0 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
2f9d0 72 0a 2a 2a 20 75 73 69 6e 67 20 61 20 63 61 6c  r.** using a cal
2f9e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  l to sqlite3_fre
2f9f0 65 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61  e()..** .** If a
2fa00 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
2fa10 72 73 2c 20 28 2a 70 52 63 29 20 69 73 20 73 65  rs, (*pRc) is se
2fa20 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
2fa30 4d 20 61 6e 64 20 61 20 4e 55 4c 4c 20 0a 2a 2a  M and a NULL .**
2fa40 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2fa50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
2fa60 72 20 2a 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28  r *shellMPrintf(
2fa70 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20  int *pRc, const 
2fa80 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
2fa90 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
2faa0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
2fab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61  ITE_OK ){.    va
2fac0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
2fad0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
2fae0 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
2faf0 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
2fb00 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
2fb10 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  (ap);.    if( z=
2fb20 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
2fb30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2fb40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2fb50 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
2fb60 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 74 68 65  When running the
2fb70 20 22 2e 72 65 63 6f 76 65 72 22 20 63 6f 6d 6d   ".recover" comm
2fb80 61 6e 64 2c 20 65 61 63 68 20 6f 75 74 70 75 74  and, each output
2fb90 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20   table, and the 
2fba0 73 70 65 63 69 61 6c 0a 2a 2a 20 6f 72 70 68 61  special.** orpha
2fbb0 6e 65 64 20 72 6f 77 20 74 61 62 6c 65 20 69 66  ned row table if
2fbc0 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64 2c   it is required,
2fbd0 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20   is represented 
2fbe0 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a  by an instance.*
2fbf0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
2fc00 6e 67 20 73 74 72 75 63 74 2e 0a 2a 2f 0a 74 79  ng struct..*/.ty
2fc10 70 65 64 65 66 20 73 74 72 75 63 74 20 52 65 63  pedef struct Rec
2fc20 6f 76 65 72 54 61 62 6c 65 20 52 65 63 6f 76 65  overTable Recove
2fc30 72 54 61 62 6c 65 3b 0a 73 74 72 75 63 74 20 52  rTable;.struct R
2fc40 65 63 6f 76 65 72 54 61 62 6c 65 20 7b 0a 20 20  ecoverTable {.  
2fc50 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 3b 20 20  char *zQuoted;  
2fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc70 2f 2a 20 51 75 6f 74 65 64 20 76 65 72 73 69 6f  /* Quoted versio
2fc80 6e 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 20  n of table name 
2fc90 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fcc0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  f columns in tab
2fcd0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  le */.  char **a
2fce0 7a 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  zlCol;          
2fcf0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2fd00 20 6f 66 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 73   of column lists
2fd10 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 3b 20 20   */.  int iPk;  
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2fd40 66 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f IPK column */.
2fd50 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  };../*.** Free a
2fd60 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62   RecoverTable ob
2fd70 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  ject allocated b
2fd80 79 20 72 65 63 6f 76 65 72 46 69 6e 64 54 61 62  y recoverFindTab
2fd90 6c 65 28 29 20 6f 72 0a 2a 2a 20 72 65 63 6f 76  le() or.** recov
2fda0 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28 29 2e  erOrphanTable().
2fdb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fdc0 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65  recoverFreeTable
2fdd0 28 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70  (RecoverTable *p
2fde0 54 61 62 29 7b 0a 20 20 69 66 28 20 70 54 61 62  Tab){.  if( pTab
2fdf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2fe00 66 72 65 65 28 70 54 61 62 2d 3e 7a 51 75 6f 74  free(pTab->zQuot
2fe10 65 64 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ed);.    if( pTa
2fe20 62 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20  b->azlCol ){.   
2fe30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2fe40 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 61 62  for(i=0; i<=pTab
2fe50 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
2fe60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2fe70 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b  ee(pTab->azlCol[
2fe80 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
2fe90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2fea0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 29 3b 0a 20  pTab->azlCol);. 
2feb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2fec0 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 7d  _free(pTab);.  }
2fed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2fee0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2fef0 6f 70 20 69 66 20 28 2a 70 52 63 29 20 69 73 20  op if (*pRc) is 
2ff00 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
2ff10 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e  en it is called.
2ff20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
2ff30 74 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  t allocates and 
2ff40 72 65 74 75 72 6e 73 20 61 20 52 65 63 6f 76 65  returns a Recove
2ff50 72 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 62 61  rTable object ba
2ff60 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 69  sed on the.** fi
2ff70 6e 61 6c 20 66 6f 75 72 20 61 72 67 75 6d 65 6e  nal four argumen
2ff80 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ts passed to thi
2ff90 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
2ffa0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
2ffb0 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63  lity.** of the c
2ffc0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
2ffd0 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65 74  lly free the ret
2ffe0 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 75 73 69  urned object usi
2fff0 6e 67 0a 2a 2a 20 72 65 63 6f 76 65 72 46 72 65  ng.** recoverFre
30000 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61  eTable()..*/.sta
30010 74 69 63 20 52 65 63 6f 76 65 72 54 61 62 6c 65  tic RecoverTable
30020 20 2a 72 65 63 6f 76 65 72 4e 65 77 54 61 62 6c   *recoverNewTabl
30030 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
30060 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
30070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
30080 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
30090 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
300a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
300b0 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
300c0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
300d0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
300e0 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74 6b 65 79  */.  int bIntkey
300f0 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 0a 29 7b  , .  int nCol.){
30100 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 74 6d  .  sqlite3 *dbtm
30110 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
30120 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 68 61     /* sqlite3 ha
30130 6e 64 6c 65 20 66 6f 72 20 74 65 73 74 69 6e 67  ndle for testing
30140 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
30150 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63  .  int rc = *pRc
30160 3b 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65  ;.  RecoverTable
30170 20 2a 70 54 61 62 20 3d 20 30 3b 0a 0a 20 20 70   *pTab = 0;..  p
30180 54 61 62 20 3d 20 28 52 65 63 6f 76 65 72 54 61  Tab = (RecoverTa
30190 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63  ble*)shellMalloc
301a0 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 52 65 63  (&rc, sizeof(Rec
301b0 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a 20 20 69  overTable));.  i
301c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
301d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 71 6c   ){.    int nSql
301e0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Col = 0;.    int
301f0 20 62 53 71 6c 49 6e 74 6b 65 79 20 3d 20 30 3b   bSqlIntkey = 0;
30200 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
30210 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
30220 20 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69    .    rc = sqli
30230 74 65 33 5f 6f 70 65 6e 28 22 22 2c 20 26 64 62  te3_open("", &db
30240 74 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmp);.    if( rc
30250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30270 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20 22 50  3_exec(dbtmp, "P
30280 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
30290 63 68 65 6d 61 20 3d 20 6f 6e 22 2c 20 30 2c 20  chema = on", 0, 
302a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
302b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
302c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
302d0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
302e0 74 6d 70 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  tmp, zSql, 0, 0,
302f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
30300 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
30310 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30330 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64     goto finished
30340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30350 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
30360 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72  Printf(dbtmp, &r
30370 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20  c, &pStmt, .    
30380 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
30390 74 28 2a 29 20 46 52 4f 4d 20 70 72 61 67 6d 61  t(*) FROM pragma
303a0 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22  _table_info(%Q)"
303b0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
303c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
303d0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
303e0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
303f0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
30400 20 6e 53 71 6c 43 6f 6c 20 3d 20 73 71 6c 69 74   nSqlCol = sqlit
30410 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30420 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
30430 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
30440 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
30450 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30460 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c 43 6f 6c 3c  E_OK || nSqlCol<
30470 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 67 6f  nCol ){.      go
30480 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  to finished;.   
30490 20 7d 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65   }..    shellPre
304a0 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
304b0 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
304c0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28 22        "SELECT ("
304d0 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
304e0 20 73 75 62 73 74 72 28 64 61 74 61 2c 31 2c 31   substr(data,1,1
304f0 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73 71  )==X'0D' FROM sq
30500 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45 52  lite_dbpage WHER
30510 45 20 70 67 6e 6f 3d 72 6f 6f 74 70 61 67 65 22  E pgno=rootpage"
30520 0a 20 20 20 20 20 20 22 29 20 46 52 4f 4d 20 73  .      ") FROM s
30530 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
30540 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a  RE name = %Q", z
30550 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
30560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30570 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
30580 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
30590 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 62 53  tmt) ){.      bS
305a0 71 6c 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69 74  qlIntkey = sqlit
305b0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
305c0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
305d0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
305e0 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
305f0 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d     if( bIntkey==
30600 62 53 71 6c 49 6e 74 6b 65 79 20 29 7b 0a 20 20  bSqlIntkey ){.  
30610 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
30620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b   const char *zPk
30630 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20   = "_rowid_";.  
30640 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
30650 20 2a 70 50 6b 46 69 6e 64 65 72 20 3d 20 30 3b   *pPkFinder = 0;
30660 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
30670 69 73 20 69 73 20 61 6e 20 69 6e 74 6b 65 79 20  is is an intkey 
30680 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72 65 20  table and there 
30690 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
306a0 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
306b0 20 2a 2a 20 73 65 74 20 7a 50 6b 20 74 6f 20 74   ** set zPk to t
306c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 50  he name of the P
306d0 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20 70 54  K column, and pT
306e0 61 62 2d 3e 69 50 6b 20 74 6f 20 74 68 65 20 69  ab->iPk to the i
306f0 6e 64 65 78 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ndex.      ** of
30700 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 77 68 65   the column, whe
30710 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 30  re columns are 0
30720 2d 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c  -numbered from l
30730 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20  eft to right..  
30740 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68      ** Or, if th
30750 69 73 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  is is a WITHOUT 
30760 52 4f 57 49 44 20 74 61 62 6c 65 20 6f 72 20 69  ROWID table or i
30770 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49 50  f there is no IP
30780 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  K column,.      
30790 2a 2a 20 6c 65 61 76 65 20 7a 50 6b 20 61 73 20  ** leave zPk as 
307a0 22 5f 72 6f 77 69 64 5f 22 20 61 6e 64 20 70 54  "_rowid_" and pT
307b0 61 62 2d 3e 69 50 6b 20 61 74 20 2d 32 2e 20 20  ab->iPk at -2.  
307c0 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
307d0 50 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20 20 69  Pk = -2;.      i
307e0 66 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20 20  f( bIntkey ){.  
307f0 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
30800 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
30810 26 72 63 2c 20 26 70 50 6b 46 69 6e 64 65 72 2c  &rc, &pPkFinder,
30820 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c   .          "SEL
30830 45 43 54 20 63 69 64 2c 20 6e 61 6d 65 20 46 52  ECT cid, name FR
30840 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
30850 69 6e 66 6f 28 25 51 29 20 22 0a 20 20 20 20 20  info(%Q) ".     
30860 20 20 20 20 20 22 20 20 57 48 45 52 45 20 70 6b       "  WHERE pk
30870 3d 31 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 74  =1 AND type='int
30880 65 67 65 72 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  eger' COLLATE no
30890 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
308a0 22 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54  "  AND NOT EXIST
308b0 53 20 28 53 45 4c 45 43 54 20 63 69 64 20 46 52  S (SELECT cid FR
308c0 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
308d0 69 6e 66 6f 28 25 51 29 20 57 48 45 52 45 20 70  info(%Q) WHERE p
308e0 6b 3d 32 29 22 0a 20 20 20 20 20 20 20 20 20 20  k=2)".          
308f0 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20  , zName, zName. 
30900 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
30910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30920 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
30930 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
30940 70 50 6b 46 69 6e 64 65 72 29 20 29 7b 0a 20 20  pPkFinder) ){.  
30950 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50          pTab->iP
30960 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
30970 6d 6e 5f 69 6e 74 28 70 50 6b 46 69 6e 64 65 72  mn_int(pPkFinder
30980 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30990 7a 50 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zPk = (const cha
309a0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
309b0 6e 5f 74 65 78 74 28 70 50 6b 46 69 6e 64 65 72  n_text(pPkFinder
309c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
309d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
309e0 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73  Tab->zQuoted = s
309f0 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c  hellMPrintf(&rc,
30a00 20 22 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%Q", zName);. 
30a10 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f       pTab->azlCo
30a20 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73 68 65 6c  l = (char**)shel
30a30 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a  lMalloc(&rc, siz
30a40 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 6e 53  eof(char*) * (nS
30a50 71 6c 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 20  qlCol+1));.     
30a60 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 53   pTab->nCol = nS
30a70 71 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 69 66  qlCol;..      if
30a80 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20  ( bIntkey ){.   
30a90 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f       pTab->azlCo
30aa0 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69  l[0] = shellMPri
30ab0 6e 74 66 28 26 72 63 2c 20 22 25 51 22 2c 20 7a  ntf(&rc, "%Q", z
30ac0 50 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pk);.      }else
30ad0 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
30ae0 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c  azlCol[0] = shel
30af0 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 22  lMPrintf(&rc, ""
30b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30b10 20 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 68   i = 1;.      sh
30b20 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
30b30 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53  (dbtmp, &rc, &pS
30b40 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tmt, .          
30b50 22 53 45 4c 45 43 54 20 25 51 20 7c 7c 20 67 72  "SELECT %Q || gr
30b60 6f 75 70 5f 63 6f 6e 63 61 74 28 6e 61 6d 65 2c  oup_concat(name,
30b70 20 27 2c 20 27 29 20 22 0a 20 20 20 20 20 20 20   ', ') ".       
30b80 20 20 20 22 20 20 46 49 4c 54 45 52 20 28 57 48     "  FILTER (WH
30b90 45 52 45 20 63 69 64 21 3d 25 64 29 20 4f 56 45  ERE cid!=%d) OVE
30ba0 52 20 28 4f 52 44 45 52 20 42 59 20 25 73 20 63  R (ORDER BY %s c
30bb0 69 64 29 20 22 0a 20 20 20 20 20 20 20 20 20 20  id) ".          
30bc0 22 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62  "FROM pragma_tab
30bd0 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20  le_info(%Q)", . 
30be0 20 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79           bIntkey
30bf0 20 3f 20 22 2c 20 22 20 3a 20 22 22 2c 20 70 54   ? ", " : "", pT
30c00 61 62 2d 3e 69 50 6b 2c 20 0a 20 20 20 20 20 20  ab->iPk, .      
30c10 20 20 20 20 62 49 6e 74 6b 65 79 20 3f 20 22 22      bIntkey ? ""
30c20 20 3a 20 22 28 43 41 53 45 20 57 48 45 4e 20 70   : "(CASE WHEN p
30c30 6b 3d 30 20 54 48 45 4e 20 31 30 30 30 30 30 30  k=0 THEN 1000000
30c40 20 45 4c 53 45 20 70 6b 20 45 4e 44 29 2c 20 22   ELSE pk END), "
30c50 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ,.          zNam
30c60 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
30c70 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
30c80 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
30c90 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
30ca0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
30cb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30cc0 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
30cd0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
30ce0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
30cf0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  0);.        pTab
30d00 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d 20 73 68  ->azlCol[i] = sh
30d10 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20  ellMPrintf(&rc, 
30d20 22 25 73 25 73 22 2c 20 70 54 61 62 2d 3e 61 7a  "%s%s", pTab->az
30d30 6c 43 6f 6c 5b 30 5d 2c 20 7a 54 65 78 74 29 3b  lCol[0], zText);
30d40 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
30d50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c      }.      shel
30d60 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
30d70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 73 68  Stmt);..      sh
30d80 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
30d90 20 70 50 6b 46 69 6e 64 65 72 29 3b 0a 20 20 20   pPkFinder);.   
30da0 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65   }.  }.. finishe
30db0 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d:.  sqlite3_clo
30dc0 73 65 28 64 62 74 6d 70 29 3b 0a 20 20 2a 70 52  se(dbtmp);.  *pR
30dd0 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 72 63  c = rc;.  if( rc
30de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
30df0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 7a 51  pTab && pTab->zQ
30e00 75 6f 74 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20  uoted==0) ){.   
30e10 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
30e20 65 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61  e(pTab);.    pTa
30e30 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  b = 0;.  }.  ret
30e40 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
30e50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30e60 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 73 65   is called to se
30e70 61 72 63 68 20 74 68 65 20 73 63 68 65 6d 61 20  arch the schema 
30e80 72 65 63 6f 76 65 72 65 64 20 66 72 6f 6d 20 74  recovered from t
30e90 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  he.** sqlite_mas
30ea0 74 65 72 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ter table of the
30eb0 20 28 70 6f 73 73 69 62 6c 79 29 20 63 6f 72 72   (possibly) corr
30ec0 75 70 74 20 64 61 74 61 62 61 73 65 20 61 73 20  upt database as 
30ed0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 22 2e 72  part.** of a ".r
30ee0 65 63 6f 76 65 72 22 20 63 6f 6d 6d 61 6e 64 2e  ecover" command.
30ef0 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 66   Specifically, f
30f00 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
30f10 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 52 6f  root page.** iRo
30f20 6f 74 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ot and at least 
30f30 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 20 41 64  nCol columns. Ad
30f40 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 62  ditionally, if b
30f50 49 6e 74 6b 65 79 20 69 73 20 30 2c 20 74 68 65  Intkey is 0, the
30f60 0a 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20 62  .** table must b
30f70 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  e a WITHOUT ROWI
30f80 44 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 20 6e  D table, or if n
30f90 6f 6e 2d 7a 65 72 6f 2c 20 6e 6f 74 20 6f 6e 65  on-zero, not one
30fa0 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 2e 0a 2a 2a   of.** those..**
30fb0 0a 2a 2a 20 49 66 20 61 20 74 61 62 6c 65 20 69  .** If a table i
30fc0 73 20 66 6f 75 6e 64 2c 20 61 20 28 52 65 63 6f  s found, a (Reco
30fd0 76 65 72 54 61 62 6c 65 2a 29 20 6f 62 6a 65 63  verTable*) objec
30fe0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  t is returned. O
30ff0 72 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  r, if.** no such
31000 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c   table is found,
31010 20 62 75 74 20 62 49 6e 74 6b 65 79 20 69 73 20   but bIntkey is 
31020 66 61 6c 73 65 20 61 6e 64 20 69 52 6f 6f 74 20  false and iRoot 
31030 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 20  is the .** root 
31040 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  page of an index
31050 20 69 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65   in the recovere
31060 64 20 73 63 68 65 6d 61 2c 20 74 68 65 6e 20 28  d schema, then (
31070 2a 70 62 4e 6f 6f 70 29 20 69 73 0a 2a 2a 20 73  *pbNoop) is.** s
31080 65 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 4e  et to true and N
31090 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 20 4f 72  ULL returned. Or
310a0 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  , if there is no
310b0 20 73 75 63 68 20 74 61 62 6c 65 20 6f 72 0a 2a   such table or.*
310c0 2a 20 69 6e 64 65 78 2c 20 4e 55 4c 4c 20 69 73  * index, NULL is
310d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28 2a   returned and (*
310e0 70 62 4e 6f 6f 70 29 20 73 65 74 20 74 6f 20 30  pbNoop) set to 0
310f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
31100 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
31110 73 68 6f 75 6c 64 20 77 72 69 74 65 20 64 61 74  should write dat
31120 61 20 74 6f 20 74 68 65 20 6f 72 70 68 61 6e 73  a to the orphans
31130 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
31140 63 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a  c RecoverTable *
31150 72 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65  recoverFindTable
31160 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
31170 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
31180 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
31190 74 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  te object */.  i
311a0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
311c0 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
311d0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  code */.  int iR
311e0 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
311f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
31200 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
31210 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74 6b 65 79  */.  int bIntkey
31220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31230 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
31240 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
31250 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20   */.  int nCol, 
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31270 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31280 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  of columns in ta
31290 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ble */.  int *pb
312a0 4e 6f 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  Noop            
312b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
312c0 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69   True if iRoot i
312d0 73 20 72 6f 6f 74 20 6f 66 20 69 6e 64 65 78 20  s root of index 
312e0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
312f0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
31300 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20  .  RecoverTable 
31310 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  *pRet = 0;.  int
31320 20 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 63 6f   bNoop = 0;.  co
31330 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
31340 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
31350 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20   *zName = 0;..  
31360 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 72 65  /* Search the re
31370 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61 20 66  covered schema f
31380 6f 72 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74  or an object wit
31390 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
313a0 74 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65  t. */.  shellPre
313b0 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74  parePrintf(pStat
313c0 65 2d 3e 64 62 2c 20 70 52 63 2c 20 26 70 53 74  e->db, pRc, &pSt
313d0 6d 74 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  mt,.      "SELEC
313e0 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 73 71  T type, name, sq
313f0 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  l FROM recovery.
31400 73 63 68 65 6d 61 20 57 48 45 52 45 20 72 6f 6f  schema WHERE roo
31410 74 70 61 67 65 3d 25 64 22 2c 20 69 52 6f 6f 74  tpage=%d", iRoot
31420 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a  .  );.  while( *
31430 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
31440 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
31450 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
31460 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) ){.    const c
31470 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f  har *zType = (co
31480 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
31490 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
314a0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
314b0 20 62 49 6e 74 6b 65 79 3d 3d 30 20 26 26 20 73   bIntkey==0 && s
314c0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
314d0 54 79 70 65 2c 20 22 69 6e 64 65 78 22 29 3d 3d  Type, "index")==
314e0 30 20 29 7b 0a 20 20 20 20 20 20 62 4e 6f 6f 70  0 ){.      bNoop
314f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
31500 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
31510 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
31520 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29  (zType, "table")
31530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ==0 ){.      zNa
31540 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
31550 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
31560 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
31570 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 28 63  .      zSql = (c
31580 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
31590 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
315a0 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20  Stmt, 2);.      
315b0 70 52 65 74 20 3d 20 72 65 63 6f 76 65 72 4e 65  pRet = recoverNe
315c0 77 54 61 62 6c 65 28 70 52 63 2c 20 7a 4e 61 6d  wTable(pRc, zNam
315d0 65 2c 20 7a 53 71 6c 2c 20 62 49 6e 74 6b 65 79  e, zSql, bIntkey
315e0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  , nCol);.      b
315f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
31600 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
31610 28 70 52 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (pRc, pStmt);.  
31620 2a 70 62 4e 6f 6f 70 20 3d 20 62 4e 6f 6f 70 3b  *pbNoop = bNoop;
31630 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
31640 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
31650 61 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f  a RecoverTable o
31660 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
31670 6e 67 20 74 68 65 20 6f 72 70 68 61 6e 73 20 74  ng the orphans t
31680 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
31690 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72 65  RecoverTable *re
316a0 63 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65  coverOrphanTable
316b0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
316c0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
316d0 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
316e0 74 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  te object */.  i
316f0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31710 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
31720 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
31730 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f  char *zLostAndFo
31740 75 6e 64 2c 20 20 20 20 20 20 2f 2a 20 42 61 73  und,      /* Bas
31750 65 20 6e 61 6d 65 20 66 6f 72 20 6f 72 70 68 61  e name for orpha
31760 6e 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ns table */.  in
31770 74 20 6e 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t nCol          
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31790 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   Number of user 
317a0 64 61 74 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  data columns */.
317b0 29 7b 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c  ){.  RecoverTabl
317c0 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69  e *pTab = 0;.  i
317d0 66 28 20 6e 43 6f 6c 3e 3d 30 20 26 26 20 2a 70  f( nCol>=0 && *p
317e0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
317f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
31800 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
31810 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 61  etermines the na
31820 6d 65 20 6f 66 20 74 68 65 20 6f 72 70 68 61 6e  me of the orphan
31830 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 65 66   table. The pref
31840 65 72 65 64 0a 20 20 20 20 2a 2a 20 6e 61 6d 65  ered.    ** name
31850 20 69 73 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e   is zLostAndFoun
31860 64 2e 20 42 75 74 20 69 66 20 74 68 61 74 20 63  d. But if that c
31870 6c 61 73 68 65 73 20 77 69 74 68 20 61 6e 6f 74  lashes with anot
31880 68 65 72 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  her name.    ** 
31890 69 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65 64  in the recovered
318a0 20 73 63 68 65 6d 61 2c 20 74 72 79 20 7a 4c 6f   schema, try zLo
318b0 73 74 41 6e 64 46 6f 75 6e 64 5f 30 2c 20 7a 4c  stAndFound_0, zL
318c0 6f 73 74 41 6e 64 46 6f 75 6e 64 5f 31 0a 20 20  ostAndFound_1.  
318d0 20 20 2a 2a 20 61 6e 64 20 73 6f 20 6f 6e 20 75    ** and so on u
318e0 6e 74 69 6c 20 61 20 6e 6f 6e 2d 63 6c 61 73 68  ntil a non-clash
318f0 69 6e 67 20 6e 61 6d 65 20 69 73 20 66 6f 75 6e  ing name is foun
31900 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  d.  */.    int i
31910 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Tab = 0;.    cha
31920 72 20 2a 7a 54 61 62 20 3d 20 73 68 65 6c 6c 4d  r *zTab = shellM
31930 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73 22  Printf(pRc, "%s"
31940 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 29  , zLostAndFound)
31950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
31960 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 20  mt *pTest = 0;. 
31970 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28     shellPrepare(
31980 70 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c  pState->db, pRc,
31990 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
319a0 20 31 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79   1 FROM recovery
319b0 2e 73 63 68 65 6d 61 20 57 48 45 52 45 20 6e 61  .schema WHERE na
319c0 6d 65 3d 3f 22 2c 20 26 70 54 65 73 74 0a 20 20  me=?", &pTest.  
319d0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65    );.    if( pTe
319e0 73 74 20 29 20 73 71 6c 69 74 65 33 5f 62 69 6e  st ) sqlite3_bin
319f0 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c  d_text(pTest, 1,
31a00 20 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54   zTab, -1, SQLIT
31a10 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
31a20 20 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53    while( *pRc==S
31a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
31a40 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
31a50 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
31a60 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
31a70 70 52 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20  pRc, pTest);.   
31a80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31a90 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 54 61  zTab);.      zTa
31aa0 62 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  b = shellMPrintf
31ab0 28 70 52 63 2c 20 22 25 73 5f 25 64 22 2c 20 7a  (pRc, "%s_%d", z
31ac0 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 69 54  LostAndFound, iT
31ad0 61 62 2b 2b 29 3b 0a 20 20 20 20 20 20 73 71 6c  ab++);.      sql
31ae0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
31af0 54 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d  Test, 1, zTab, -
31b00 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
31b10 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ENT);.    }.    
31b20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52  shellFinalize(pR
31b30 63 2c 20 70 54 65 73 74 29 3b 0a 0a 20 20 20 20  c, pTest);..    
31b40 70 54 61 62 20 3d 20 28 52 65 63 6f 76 65 72 54  pTab = (RecoverT
31b50 61 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f  able*)shellMallo
31b60 63 28 70 52 63 2c 20 73 69 7a 65 6f 66 28 52 65  c(pRc, sizeof(Re
31b70 63 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a 20 20  coverTable));.  
31b80 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
31b90 20 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65      pTab->zQuote
31ba0 64 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  d = shellMPrintf
31bb0 28 70 52 63 2c 20 22 25 51 22 2c 20 7a 54 61 62  (pRc, "%Q", zTab
31bc0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  );.      pTab->n
31bd0 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
31be0 20 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32    pTab->iPk = -2
31bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c  ;.      if( nCol
31c00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  >0 ){.        pT
31c10 61 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68  ab->azlCol = (ch
31c20 61 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63  ar**)shellMalloc
31c30 28 70 52 63 2c 20 73 69 7a 65 6f 66 28 63 68 61  (pRc, sizeof(cha
31c40 72 2a 29 20 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b  r*) * (nCol+1));
31c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
31c60 62 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20  b->azlCol ){.   
31c70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
31c80 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c  Col[nCol] = shel
31c90 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 22  lMPrintf(pRc, ""
31ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
31cb0 28 69 3d 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b  (i=nCol-1; i>=0;
31cc0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20   i--){.         
31cd0 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b     pTab->azlCol[
31ce0 69 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  i] = shellMPrint
31cf0 66 28 70 52 63 2c 20 22 25 73 2c 20 4e 55 4c 4c  f(pRc, "%s, NULL
31d00 22 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b  ", pTab->azlCol[
31d10 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i+1]);.         
31d20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31d30 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
31d40 2a 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc!=SQLITE_OK 
31d50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 63 6f 76  ){.        recov
31d60 65 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62  erFreeTable(pTab
31d70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
31d80 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
31d90 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
31da0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
31db0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
31dc0 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28  CREATE TABLE %s(
31dd0 72 6f 6f 74 70 67 6e 6f 20 49 4e 54 45 47 45 52  rootpgno INTEGER
31de0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
31df0 22 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 6e  "pgno INTEGER, n
31e00 66 69 65 6c 64 20 49 4e 54 45 47 45 52 2c 20 69  field INTEGER, i
31e10 64 20 49 4e 54 45 47 45 52 22 2c 20 70 54 61 62  d INTEGER", pTab
31e20 2d 3e 7a 51 75 6f 74 65 64 0a 20 20 20 20 20 20  ->zQuoted.      
31e30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72    );.        for
31e40 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
31e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61  +){.          ra
31e60 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
31e70 3e 6f 75 74 2c 20 22 2c 20 63 25 64 22 2c 20 69  >out, ", c%d", i
31e80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31e90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31ea0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 29 3b  pState->out, ");
31eb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
31ec0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
31ed0 66 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a  free(zTab);.  }.
31ee0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
31ef0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31f00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31f10 74 6f 20 72 65 63 6f 76 65 72 20 64 61 74 61 20  to recover data 
31f20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
31f30 65 2e 20 41 20 73 63 72 69 70 74 0a 2a 2a 20 74  e. A script.** t
31f40 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  o construct a ne
31f50 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  w database conta
31f60 69 6e 69 6e 67 20 61 6c 6c 20 72 65 63 6f 76 65  ining all recove
31f70 72 65 64 20 64 61 74 61 20 69 73 20 6f 75 74 70  red data is outp
31f80 75 74 0a 2a 2a 20 6f 6e 20 73 74 72 65 61 6d 20  ut.** on stream 
31f90 70 53 74 61 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a  pState->out..*/.
31fa0 73 74 61 74 69 63 20 69 6e 74 20 72 65 63 6f 76  static int recov
31fb0 65 72 44 61 74 61 62 61 73 65 43 6d 64 28 53 68  erDatabaseCmd(Sh
31fc0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
31fd0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
31fe0 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 69 6e 74   **azArg){.  int
31ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32000 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
32010 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20  *pLoop = 0;     
32020 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
32030 67 68 20 61 6c 6c 20 72 6f 6f 74 20 70 61 67 65  gh all root page
32040 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
32050 74 6d 74 20 2a 70 50 61 67 65 73 20 3d 20 30 3b  tmt *pPages = 0;
32060 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
32070 68 72 6f 75 67 68 20 61 6c 6c 20 70 61 67 65 73  hrough all pages
32080 20 69 6e 20 61 20 67 72 6f 75 70 20 2a 2f 0a 20   in a group */. 
32090 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
320a0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
320b0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
320c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 20   all cells in a 
320d0 70 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  page */.  const 
320e0 63 68 61 72 20 2a 7a 52 65 63 6f 76 65 72 79 44  char *zRecoveryD
320f0 62 20 3d 20 22 22 3b 20 20 20 2f 2a 20 4e 61 6d  b = "";   /* Nam
32100 65 20 6f 66 20 22 72 65 63 6f 76 65 72 79 22 20  e of "recovery" 
32110 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
32120 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73 74 41  nst char *zLostA
32130 6e 64 46 6f 75 6e 64 20 3d 20 22 6c 6f 73 74 5f  ndFound = "lost_
32140 61 6e 64 5f 66 6f 75 6e 64 22 3b 0a 20 20 69 6e  and_found";.  in
32150 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4f 72 70 68  t i;.  int nOrph
32160 61 6e 20 3d 20 2d 31 3b 0a 20 20 52 65 63 6f 76  an = -1;.  Recov
32170 65 72 54 61 62 6c 65 20 2a 70 4f 72 70 68 61 6e  erTable *pOrphan
32180 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 46 72   = 0;..  int bFr
32190 65 65 6c 69 73 74 20 3d 20 31 3b 20 20 20 20 20  eelist = 1;     
321a0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66           /* 0 if
321b0 20 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72   --freelist-corr
321c0 75 70 74 20 69 73 20 73 70 65 63 69 66 69 65 64  upt is specified
321d0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
321e0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
321f0 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
32200 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  [i];.    int n;.
32210 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
32220 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29  ' && z[1]=='-' )
32230 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74   z++;.    n = st
32240 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
32250 66 28 20 6e 3c 3d 31 37 20 26 26 20 6d 65 6d 63  f( n<=17 && memc
32260 6d 70 28 22 2d 66 72 65 65 6c 69 73 74 2d 63 6f  mp("-freelist-co
32270 72 72 75 70 74 22 2c 20 7a 2c 20 6e 29 3d 3d 30  rrupt", z, n)==0
32280 20 29 7b 0a 20 20 20 20 20 20 62 46 72 65 65 6c   ){.      bFreel
32290 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ist = 0;.    }el
322a0 73 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 32  se.    if( n<=12
322b0 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 72 65 63   && memcmp("-rec
322c0 6f 76 65 72 79 2d 64 62 22 2c 20 7a 2c 20 6e 29  overy-db", z, n)
322d0 3d 3d 30 20 26 26 20 69 3c 28 6e 41 72 67 2d 31  ==0 && i<(nArg-1
322e0 29 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ) ){.      i++;.
322f0 20 20 20 20 20 20 7a 52 65 63 6f 76 65 72 79 44        zRecoveryD
32300 62 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  b = azArg[i];.  
32310 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20    }else.    if( 
32320 6e 3c 3d 31 35 20 26 26 20 6d 65 6d 63 6d 70 28  n<=15 && memcmp(
32330 22 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64  "-lost-and-found
32340 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69  ", z, n)==0 && i
32350 3c 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  <(nArg-1) ){.   
32360 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 4c     i++;.      zL
32370 6f 73 74 41 6e 64 46 6f 75 6e 64 20 3d 20 61 7a  ostAndFound = az
32380 41 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  Arg[i];.    }.  
32390 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61    else{.      ra
323a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
323b0 20 22 75 6e 65 78 70 65 63 74 65 64 20 6f 70 74   "unexpected opt
323c0 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  ion: %s\n", azAr
323d0 67 5b 69 5d 29 3b 20 0a 20 20 20 20 20 20 72 61  g[i]); .      ra
323e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
323f0 20 22 6f 70 74 69 6f 6e 73 20 61 72 65 3a 5c 6e   "options are:\n
32400 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ");.      raw_pr
32410 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20  intf(stderr, "  
32420 20 20 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72    --freelist-cor
32430 72 75 70 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  rupt\n");.      
32440 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
32450 72 2c 20 22 20 20 20 20 2d 2d 72 65 63 6f 76 65  r, "    --recove
32460 72 79 2d 64 62 20 44 41 54 41 42 41 53 45 5c 6e  ry-db DATABASE\n
32470 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ");.      raw_pr
32480 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20  intf(stderr, "  
32490 20 20 2d 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75    --lost-and-fou
324a0 6e 64 20 54 41 42 4c 45 2d 4e 41 4d 45 5c 6e 22  nd TABLE-NAME\n"
324b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
324c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
324d0 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28  shellExecPrintf(
324e0 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
324f0 0a 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 61  .    /* Attach a
32500 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
32510 62 61 73 65 20 6e 61 6d 65 64 20 27 72 65 63 6f  base named 'reco
32520 76 65 72 79 27 2e 20 43 72 65 61 74 65 20 61 6e  very'. Create an
32530 20 69 6e 64 65 78 65 64 20 0a 20 20 20 20 2a 2a   indexed .    **
32540 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 73 71   cache of the sq
32550 6c 69 74 65 5f 64 62 70 74 72 20 76 69 72 74 75  lite_dbptr virtu
32560 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  al table. */.   
32570 20 22 41 54 54 41 43 48 20 25 51 20 41 53 20 72   "ATTACH %Q AS r
32580 65 63 6f 76 65 72 79 3b 22 0a 20 20 20 20 22 44  ecovery;".    "D
32590 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
325a0 53 54 53 20 72 65 63 6f 76 65 72 79 2e 64 62 70  STS recovery.dbp
325b0 74 72 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  tr;".    "DROP T
325c0 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 72  ABLE IF EXISTS r
325d0 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74  ecovery.freelist
325e0 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  ;".    "DROP TAB
325f0 4c 45 20 49 46 20 45 58 49 53 54 53 20 72 65 63  LE IF EXISTS rec
32600 6f 76 65 72 79 2e 6d 61 70 3b 22 0a 20 20 20 20  overy.map;".    
32610 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
32620 58 49 53 54 53 20 72 65 63 6f 76 65 72 79 2e 73  XISTS recovery.s
32630 63 68 65 6d 61 3b 22 0a 20 20 20 20 22 43 52 45  chema;".    "CRE
32640 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65  ATE TABLE recove
32650 72 79 2e 66 72 65 65 6c 69 73 74 28 70 67 6e 6f  ry.freelist(pgno
32660 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
32670 20 4b 45 59 29 3b 22 2c 20 7a 52 65 63 6f 76 65   KEY);", zRecove
32680 72 79 44 62 0a 20 20 29 3b 0a 0a 20 20 69 66 28  ryDb.  );..  if(
32690 20 62 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20   bFreelist ){.  
326a0 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61    shellExec(pSta
326b0 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20  te->db, &rc,.   
326c0 20 20 20 22 57 49 54 48 20 74 72 75 6e 6b 28 70     "WITH trunk(p
326d0 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20  gno) AS (".     
326e0 20 22 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c   "  SELECT shell
326f0 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22  _int32(".      "
32700 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 64 61        (SELECT da
32710 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
32720 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f  bpage WHERE pgno
32730 3d 31 29 2c 20 38 29 20 41 53 20 78 20 22 0a 20  =1), 8) AS x ". 
32740 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45 52       "      WHER
32750 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22 20 20  E x>0".      "  
32760 20 20 55 4e 49 4f 4e 22 0a 20 20 20 20 20 20 22    UNION".      "
32770 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69    SELECT shell_i
32780 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22 20 20  nt32(".      "  
32790 20 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61      (SELECT data
327a0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
327b0 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 74  age WHERE pgno=t
327c0 72 75 6e 6b 2e 70 67 6e 6f 29 2c 20 30 29 20 41  runk.pgno), 0) A
327d0 53 20 78 20 22 0a 20 20 20 20 20 20 22 20 20 20  S x ".      "   
327e0 20 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20 57 48     FROM trunk WH
327f0 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22  ERE x>0".      "
32800 29 2c 22 0a 20 20 20 20 20 20 22 66 72 65 65 6c  ),".      "freel
32810 69 73 74 28 64 61 74 61 2c 20 6e 2c 20 66 72 65  ist(data, n, fre
32820 65 70 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20  epgno) AS (".   
32830 20 20 20 22 20 20 53 45 4c 45 43 54 20 64 61 74     "  SELECT dat
32840 61 2c 20 6d 69 6e 28 31 36 33 38 34 2c 20 73 68  a, min(16384, sh
32850 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c 20  ell_int32(data, 
32860 31 29 2d 31 29 2c 20 74 2e 70 67 6e 6f 20 22 0a  1)-1), t.pgno ".
32870 20 20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f        "      FRO
32880 4d 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c 69 74  M trunk t, sqlit
32890 65 5f 64 62 70 61 67 65 20 73 20 57 48 45 52 45  e_dbpage s WHERE
328a0 20 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f 22 0a   s.pgno=t.pgno".
328b0 20 20 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e        "    UNION
328c0 20 41 4c 4c 22 0a 20 20 20 20 20 20 22 20 20 53   ALL".      "  S
328d0 45 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d 31 2c  ELECT data, n-1,
328e0 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74   shell_int32(dat
328f0 61 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20 20 20  a, 2+n) ".      
32900 22 20 20 20 20 20 20 46 52 4f 4d 20 66 72 65 65  "      FROM free
32910 6c 69 73 74 20 57 48 45 52 45 20 6e 3e 3d 30 22  list WHERE n>=0"
32920 0a 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20  .      ")".     
32930 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 72   "REPLACE INTO r
32940 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74  ecovery.freelist
32950 20 53 45 4c 45 43 54 20 66 72 65 65 70 67 6e 6f   SELECT freepgno
32960 20 46 52 4f 4d 20 66 72 65 65 6c 69 73 74 3b 22   FROM freelist;"
32970 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  .    );.  }..  s
32980 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d  hellExec(pState-
32990 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 22  >db, &rc, .    "
329a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 63  CREATE TABLE rec
329b0 6f 76 65 72 79 2e 64 62 70 74 72 28 22 0a 20 20  overy.dbptr(".  
329c0 20 20 22 20 20 20 20 20 20 70 67 6e 6f 2c 20 63    "      pgno, c
329d0 68 69 6c 64 2c 20 50 52 49 4d 41 52 59 20 4b 45  hild, PRIMARY KE
329e0 59 28 63 68 69 6c 64 2c 20 70 67 6e 6f 29 22 0a  Y(child, pgno)".
329f0 20 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52      ") WITHOUT R
32a00 4f 57 49 44 3b 22 0a 20 20 20 20 22 49 4e 53 45  OWID;".    "INSE
32a10 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
32a20 4f 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  O recovery.dbptr
32a30 28 70 67 6e 6f 2c 20 63 68 69 6c 64 29 20 22 0a  (pgno, child) ".
32a40 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20      "    SELECT 
32a50 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  * FROM sqlite_db
32a60 70 74 72 22 0a 20 20 20 20 22 20 20 20 20 20 20  ptr".    "      
32a70 57 48 45 52 45 20 70 67 6e 6f 20 4e 4f 54 20 49  WHERE pgno NOT I
32a80 4e 20 66 72 65 65 6c 69 73 74 20 41 4e 44 20 63  N freelist AND c
32a90 68 69 6c 64 20 4e 4f 54 20 49 4e 20 66 72 65 65  hild NOT IN free
32aa0 6c 69 73 74 3b 22 0a 0a 20 20 20 20 2f 2a 20 44  list;"..    /* D
32ab0 65 6c 65 74 65 20 61 6e 79 20 70 6f 69 6e 74 65  elete any pointe
32ac0 72 20 74 6f 20 70 61 67 65 20 31 2e 20 54 68 69  r to page 1. Thi
32ad0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 70  s ensures that p
32ae0 61 67 65 20 31 20 69 73 20 63 6f 6e 73 69 64 65  age 1 is conside
32af0 72 65 64 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6f  red.    ** a roo
32b00 74 20 70 61 67 65 2c 20 72 65 67 61 72 64 6c 65  t page, regardle
32b10 73 73 20 6f 66 20 68 6f 77 20 63 6f 72 72 75 70  ss of how corrup
32b20 74 20 74 68 65 20 64 62 20 69 73 2e 20 2a 2f 0a  t the db is. */.
32b30 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
32b40 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20   recovery.dbptr 
32b50 57 48 45 52 45 20 63 68 69 6c 64 20 3d 20 31 3b  WHERE child = 1;
32b60 22 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  "..    /* Delete
32b70 20 61 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   all pointers to
32b80 20 61 6e 79 20 70 61 67 65 73 20 74 68 61 74 20   any pages that 
32b90 68 61 76 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f  have more than o
32ba0 6e 65 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a  ne pointer.    *
32bb0 2a 20 74 6f 20 74 68 65 6d 2e 20 53 75 63 68 20  * to them. Such 
32bc0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 74 72  pages will be tr
32bd0 65 61 74 65 64 20 61 73 20 72 6f 6f 74 20 70 61  eated as root pa
32be0 67 65 73 20 77 68 65 6e 20 72 65 63 6f 76 65 72  ges when recover
32bf0 69 6e 67 0a 20 20 20 20 2a 2a 20 64 61 74 61 2e  ing.    ** data.
32c00 20 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45 54 45    */.    "DELETE
32c10 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
32c20 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
32c30 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53 45   IN (".    "  SE
32c40 4c 45 43 54 20 63 68 69 6c 64 20 46 52 4f 4d 20  LECT child FROM 
32c50 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 47  recovery.dbptr G
32c60 52 4f 55 50 20 42 59 20 63 68 69 6c 64 20 48 41  ROUP BY child HA
32c70 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22  VING count(*)>1"
32c80 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f  .    ");"..    /
32c90 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 6d 61  * Create the "ma
32ca0 70 22 20 74 61 62 6c 65 20 74 68 61 74 20 77 69  p" table that wi
32cb0 6c 6c 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20  ll (eventually) 
32cc0 63 6f 6e 74 61 69 6e 20 69 6e 73 74 72 75 63 74  contain instruct
32cd0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ions.    ** for 
32ce0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 65 61 63  dealing with eac
32cf0 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 62  h page in the db
32d00 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f   that contains o
32d10 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 20 20  ne or more .    
32d20 2a 2a 20 72 65 63 6f 72 64 73 2e 20 2a 2f 0a 20  ** records. */. 
32d30 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
32d40 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 22 0a   recovery.map(".
32d50 20 20 20 20 20 20 22 70 67 6e 6f 20 49 4e 54 45        "pgno INTE
32d60 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
32d70 20 6d 61 78 6c 65 6e 20 49 4e 54 2c 20 69 6e 74   maxlen INT, int
32d80 6b 65 79 2c 20 72 6f 6f 74 20 49 4e 54 22 0a 20  key, root INT". 
32d90 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a 20     ");"..    /* 
32da0 50 6f 70 75 6c 61 74 65 20 74 61 62 6c 65 20 5b  Populate table [
32db0 6d 61 70 5d 2e 20 49 66 20 74 68 65 72 65 20 61  map]. If there a
32dc0 72 65 20 63 69 72 63 75 6c 61 72 20 6c 6f 6f 70  re circular loop
32dd0 73 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  s of pages in th
32de0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32df0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
32e00 20 61 64 64 73 20 61 6c 6c 20 70 61 67 65 73 20   adds all pages 
32e10 69 6e 20 73 75 63 68 20 61 20 6c 6f 6f 70 20 74  in such a loop t
32e20 6f 20 74 68 65 20 6d 61 70 0a 20 20 20 20 2a 2a  o the map.    **
32e30 20 61 73 20 69 6e 64 69 76 69 64 75 61 6c 20 72   as individual r
32e40 6f 6f 74 20 70 61 67 65 73 2e 20 54 68 69 73 20  oot pages. This 
32e50 63 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c 65 64  could be handled
32e60 20 62 65 74 74 65 72 2e 20 20 2a 2f 0a 20 20 20   better.  */.   
32e70 20 22 57 49 54 48 20 70 61 67 65 73 28 69 2c 20   "WITH pages(i, 
32e80 6d 61 78 6c 65 6e 29 20 41 53 20 28 22 0a 20 20  maxlen) AS (".  
32e90 20 20 22 20 20 53 45 4c 45 43 54 20 70 61 67 65    "  SELECT page
32ea0 5f 63 6f 75 6e 74 2c 20 28 22 0a 20 20 20 20 22  _count, (".    "
32eb0 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 66      SELECT max(f
32ec0 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c  ield+1) FROM sql
32ed0 69 74 65 5f 64 62 64 61 74 61 20 57 48 45 52 45  ite_dbdata WHERE
32ee0 20 70 67 6e 6f 3d 70 61 67 65 5f 63 6f 75 6e 74   pgno=page_count
32ef0 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f 4d 20  ".    "  ) FROM 
32f00 70 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f 75 6e  pragma_page_coun
32f10 74 20 57 48 45 52 45 20 70 61 67 65 5f 63 6f 75  t WHERE page_cou
32f20 6e 74 3e 30 22 0a 20 20 20 20 22 20 20 20 20 55  nt>0".    "    U
32f30 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 22 20  NION ALL".    " 
32f40 20 53 45 4c 45 43 54 20 69 2d 31 2c 20 28 22 0a   SELECT i-1, (".
32f50 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20      "    SELECT 
32f60 6d 61 78 28 66 69 65 6c 64 2b 31 29 20 46 52 4f  max(field+1) FRO
32f70 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20  M sqlite_dbdata 
32f80 57 48 45 52 45 20 70 67 6e 6f 3d 69 2d 31 22 0a  WHERE pgno=i-1".
32f90 20 20 20 20 22 20 20 29 20 46 52 4f 4d 20 70 61      "  ) FROM pa
32fa0 67 65 73 20 57 48 45 52 45 20 69 3e 3d 32 22 0a  ges WHERE i>=2".
32fb0 20 20 20 20 22 29 22 0a 20 20 20 20 22 49 4e 53      ")".    "INS
32fc0 45 52 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72  ERT INTO recover
32fd0 79 2e 6d 61 70 28 70 67 6e 6f 2c 20 6d 61 78 6c  y.map(pgno, maxl
32fe0 65 6e 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f 74  en, intkey, root
32ff0 29 20 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  ) ".    "  SELEC
33000 54 20 69 2c 20 6d 61 78 6c 65 6e 2c 20 4e 55 4c  T i, maxlen, NUL
33010 4c 2c 20 28 22 0a 20 20 20 20 22 20 20 20 20 57  L, (".    "    W
33020 49 54 48 20 70 28 6f 72 69 67 2c 20 70 67 6e 6f  ITH p(orig, pgno
33030 2c 20 70 61 72 65 6e 74 29 20 41 53 20 28 22 0a  , parent) AS (".
33040 20 20 20 20 22 20 20 20 20 20 20 53 45 4c 45 43      "      SELEC
33050 54 20 30 2c 20 69 2c 20 28 53 45 4c 45 43 54 20  T 0, i, (SELECT 
33060 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65  pgno FROM recove
33070 72 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63  ry.dbptr WHERE c
33080 68 69 6c 64 3d 69 29 22 0a 20 20 20 20 22 20 20  hild=i)".    "  
33090 20 20 20 20 20 20 55 4e 49 4f 4e 20 22 0a 20 20        UNION ".  
330a0 20 20 22 20 20 20 20 20 20 53 45 4c 45 43 54 20    "      SELECT 
330b0 69 2c 20 70 2e 70 61 72 65 6e 74 2c 20 22 0a 20  i, p.parent, ". 
330c0 20 20 20 22 20 20 20 20 20 20 20 20 28 53 45 4c     "        (SEL
330d0 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65  ECT pgno FROM re
330e0 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
330f0 52 45 20 63 68 69 6c 64 3d 70 2e 70 61 72 65 6e  RE child=p.paren
33100 74 29 20 46 52 4f 4d 20 70 22 0a 20 20 20 20 22  t) FROM p".    "
33110 20 20 20 20 29 22 0a 20 20 20 20 22 20 20 20 20      )".    "    
33120 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
33130 20 70 20 57 48 45 52 45 20 28 70 61 72 65 6e 74   p WHERE (parent
33140 20 49 53 20 4e 55 4c 4c 20 4f 52 20 70 67 6e 6f   IS NULL OR pgno
33150 20 3d 20 6f 72 69 67 29 22 0a 20 20 20 20 22 29   = orig)".    ")
33160 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 70 61 67   ".    "FROM pag
33170 65 73 20 57 48 45 52 45 20 6d 61 78 6c 65 6e 20  es WHERE maxlen 
33180 3e 20 30 20 41 4e 44 20 69 20 4e 4f 54 20 49 4e  > 0 AND i NOT IN
33190 20 66 72 65 65 6c 69 73 74 3b 22 0a 20 20 20 20   freelist;".    
331a0 22 55 50 44 41 54 45 20 72 65 63 6f 76 65 72 79  "UPDATE recovery
331b0 2e 6d 61 70 20 41 53 20 6f 20 53 45 54 20 69 6e  .map AS o SET in
331c0 74 6b 65 79 20 3d 20 28 22 0a 20 20 20 20 22 20  tkey = (".    " 
331d0 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 64   SELECT substr(d
331e0 61 74 61 2c 20 31 2c 20 31 29 3d 3d 58 27 30 44  ata, 1, 1)==X'0D
331f0 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  ' FROM sqlite_db
33200 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d  page WHERE pgno=
33210 6f 2e 70 67 6e 6f 22 0a 20 20 20 20 22 29 3b 22  o.pgno".    ");"
33220 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
33230 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
33240 31 20 61 6e 64 20 61 6e 79 20 6c 69 6e 6b 65 64  1 and any linked
33250 20 70 61 67 65 73 20 69 6e 74 6f 20 74 61 62 6c   pages into tabl
33260 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 76 65 72  e.    ** recover
33270 79 2e 73 63 68 65 6d 61 2e 20 57 69 74 68 20 74  y.schema. With t
33280 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
33290 73 20 61 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  s an sqlite_mast
332a0 65 72 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  er table.  */.  
332b0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
332c0 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 28  recovery.schema(
332d0 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f  type, name, tbl_
332e0 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20  name, rootpage, 
332f0 73 71 6c 29 3b 22 0a 20 20 20 20 22 49 4e 53 45  sql);".    "INSE
33300 52 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79  RT INTO recovery
33310 2e 73 63 68 65 6d 61 20 53 45 4c 45 43 54 20 22  .schema SELECT "
33320 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45  .    "  max(CASE
33330 20 57 48 45 4e 20 66 69 65 6c 64 3d 30 20 54 48   WHEN field=0 TH
33340 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55  EN value ELSE NU
33350 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20  LL END),".    " 
33360 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66   max(CASE WHEN f
33370 69 65 6c 64 3d 31 20 54 48 45 4e 20 76 61 6c 75  ield=1 THEN valu
33380 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29  e ELSE NULL END)
33390 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41  ,".    "  max(CA
333a0 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 32 20  SE WHEN field=2 
333b0 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20  THEN value ELSE 
333c0 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20  NULL END),".    
333d0 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e  "  max(CASE WHEN
333e0 20 66 69 65 6c 64 3d 33 20 54 48 45 4e 20 76 61   field=3 THEN va
333f0 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e  lue ELSE NULL EN
33400 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28  D),".    "  max(
33410 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d  CASE WHEN field=
33420 34 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53  4 THEN value ELS
33430 45 20 4e 55 4c 4c 20 45 4e 44 29 22 0a 20 20 20  E NULL END)".   
33440 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62   "FROM sqlite_db
33450 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 20  data WHERE pgno 
33460 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  IN (".    "  SEL
33470 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65  ECT pgno FROM re
33480 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45  covery.map WHERE
33490 20 72 6f 6f 74 3d 31 22 0a 20 20 20 20 22 29 22   root=1".    ")"
334a0 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 70  .    "GROUP BY p
334b0 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20 20 20 20  gno, cell;".    
334c0 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 72 65  "CREATE INDEX re
334d0 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 5f 72 6f  covery.schema_ro
334e0 6f 74 70 61 67 65 20 4f 4e 20 73 63 68 65 6d 61  otpage ON schema
334f0 28 72 6f 6f 74 70 61 67 65 29 3b 22 0a 20 20 29  (rootpage);".  )
33500 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74  ;..  /* Open a t
33510 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
33520 20 70 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20 6e   print out all n
33530 6f 6e 2d 76 69 72 74 75 61 6c 2c 20 6e 6f 6e 2d  on-virtual, non-
33540 22 73 71 6c 69 74 65 5f 25 22 20 0a 20 20 2a 2a  "sqlite_%" .  **
33550 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
33560 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 65 78  atements that ex
33570 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
33580 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
33590 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
335a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
335b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
335c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 61  Stmt = 0;.    ra
335d0 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
335e0 3e 6f 75 74 2c 20 22 42 45 47 49 4e 3b 5c 6e 22  >out, "BEGIN;\n"
335f0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
33600 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
33610 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
33620 73 63 68 65 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29  schema = on;\n")
33630 3b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  ;.    shellPrepa
33640 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
33650 72 63 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  rc,.        "SEL
33660 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 72 65 63  ECT sql FROM rec
33670 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20  overy.schema ". 
33680 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
33690 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 73  pe='table' AND s
336a0 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20  ql LIKE 'create 
336b0 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74  table%'", &pStmt
336c0 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
336d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
336e0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
336f0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
33700 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  mt) ){.      con
33710 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
33720 54 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  Table = (const c
33730 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
33740 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
33750 30 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  0);.      raw_pr
33760 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
33770 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
33780 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
33790 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ;\n", .         
337a0 20 26 7a 43 72 65 61 74 65 54 61 62 6c 65 5b 31   &zCreateTable[1
337b0 32 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  2].      );.    
337c0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
337d0 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
337e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
337f0 65 20 6f 75 74 20 69 66 20 61 6e 20 6f 72 70 68  e out if an orph
33800 61 6e 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  an table will be
33810 20 72 65 71 75 69 72 65 64 2e 20 41 6e 64 20 69   required. And i
33820 66 20 73 6f 2c 20 68 6f 77 20 6d 61 6e 79 0a 20  f so, how many. 
33830 20 2a 2a 20 75 73 65 72 20 63 6f 6c 75 6d 6e 73   ** user columns
33840 20 69 74 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61   it should conta
33850 69 6e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65  in */.  shellPre
33860 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c  pare(pState->db,
33870 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22 53 45   &rc, .      "SE
33880 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61  LECT coalesce(ma
33890 78 28 6d 61 78 6c 65 6e 29 2c 20 2d 32 29 20 46  x(maxlen), -2) F
338a0 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61 70  ROM recovery.map
338b0 20 57 48 45 52 45 20 72 6f 6f 74 3e 31 22 0a 20   WHERE root>1". 
338c0 20 20 20 20 20 2c 20 26 70 4c 6f 6f 70 0a 20 20       , &pLoop.  
338d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
338e0 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
338f0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
33900 65 70 28 70 4c 6f 6f 70 29 20 29 7b 0a 20 20 20  ep(pLoop) ){.   
33910 20 6e 4f 72 70 68 61 6e 20 3d 20 73 71 6c 69 74   nOrphan = sqlit
33920 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c  e3_column_int(pL
33930 6f 6f 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  oop, 0);.  }.  s
33940 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
33950 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 70 4c 6f 6f  , pLoop);.  pLoo
33960 70 20 3d 20 30 3b 0a 0a 20 20 73 68 65 6c 6c 50  p = 0;..  shellP
33970 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64  repare(pState->d
33980 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53  b, &rc,.      "S
33990 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
339a0 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45  recovery.map WHE
339b0 52 45 20 72 6f 6f 74 3d 3f 22 2c 20 26 70 50 61  RE root=?", &pPa
339c0 67 65 73 0a 20 20 29 3b 0a 20 20 73 68 65 6c 6c  ges.  );.  shell
339d0 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e  Prepare(pState->
339e0 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22  db, &rc,.      "
339f0 53 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64  SELECT max(field
33a00 29 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ), group_concat(
33a10 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e  shell_escape_crn
33a20 6c 28 71 75 6f 74 65 28 76 61 6c 75 65 29 29 2c  l(quote(value)),
33a30 20 27 2c 20 27 29 22 0a 20 20 20 20 20 20 22 46   ', ')".      "F
33a40 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74  ROM sqlite_dbdat
33a50 61 20 57 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f  a WHERE pgno = ?
33a60 20 41 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f 22   AND field != ?"
33a70 0a 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59  .      "GROUP BY
33a80 20 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a   cell", &pCells.
33a90 20 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20    );..  /* Loop 
33aa0 74 68 72 6f 75 67 68 20 65 61 63 68 20 72 6f 6f  through each roo
33ab0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65  t page. */.  she
33ac0 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65  llPrepare(pState
33ad0 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20  ->db, &rc, .    
33ae0 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20    "SELECT root, 
33af0 69 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c  intkey, max(maxl
33b00 65 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  en) FROM recover
33b10 79 2e 6d 61 70 22 20 0a 20 20 20 20 20 20 22 20  y.map" .      " 
33b20 57 48 45 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f  WHERE root>1 GRO
33b30 55 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b  UP BY root, intk
33b40 65 79 20 4f 52 44 45 52 20 42 59 20 72 6f 6f 74  ey ORDER BY root
33b50 3d 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c  =(".      "  SEL
33b60 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
33b70 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
33b80 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71  a WHERE name='sq
33b90 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
33ba0 20 20 20 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f        ")", &pLoo
33bb0 70 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  p.  );.  while( 
33bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33bd0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
33be0 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29  ite3_step(pLoop)
33bf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f   ){.    int iRoo
33c00 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
33c10 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29  mn_int(pLoop, 0)
33c20 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 74 6b 65  ;.    int bIntke
33c30 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  y = sqlite3_colu
33c40 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29  mn_int(pLoop, 1)
33c50 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
33c60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
33c70 69 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20  int(pLoop, 2);. 
33c80 20 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30     int bNoop = 0
33c90 3b 0a 20 20 20 20 52 65 63 6f 76 65 72 54 61 62  ;.    RecoverTab
33ca0 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 70  le *pTab;..    p
33cb0 54 61 62 20 3d 20 72 65 63 6f 76 65 72 46 69 6e  Tab = recoverFin
33cc0 64 54 61 62 6c 65 28 70 53 74 61 74 65 2c 20 26  dTable(pState, &
33cd0 72 63 2c 20 69 52 6f 6f 74 2c 20 62 49 6e 74 6b  rc, iRoot, bIntk
33ce0 65 79 2c 20 6e 43 6f 6c 2c 20 26 62 4e 6f 6f 70  ey, nCol, &bNoop
33cf0 29 3b 0a 20 20 20 20 69 66 28 20 62 4e 6f 6f 70  );.    if( bNoop
33d00 20 7c 7c 20 72 63 20 29 20 63 6f 6e 74 69 6e 75   || rc ) continu
33d10 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  e;.    if( pTab=
33d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
33d30 70 4f 72 70 68 61 6e 3d 3d 30 20 29 7b 0a 20 20  pOrphan==0 ){.  
33d40 20 20 20 20 20 20 70 4f 72 70 68 61 6e 20 3d 20        pOrphan = 
33d50 72 65 63 6f 76 65 72 4f 72 70 68 61 6e 54 61 62  recoverOrphanTab
33d60 6c 65 28 70 53 74 61 74 65 2c 20 26 72 63 2c 20  le(pState, &rc, 
33d70 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 6e  zLostAndFound, n
33d80 4f 72 70 68 61 6e 29 3b 0a 20 20 20 20 20 20 7d  Orphan);.      }
33d90 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 4f  .      pTab = pO
33da0 72 70 68 61 6e 3b 0a 20 20 20 20 20 20 69 66 28  rphan;.      if(
33db0 20 70 54 61 62 3d 3d 30 20 29 20 62 72 65 61 6b   pTab==0 ) break
33dc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33dd0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
33de0 63 6d 70 28 70 54 61 62 2d 3e 7a 51 75 6f 74 65  cmp(pTab->zQuote
33df0 64 2c 20 22 27 73 71 6c 69 74 65 5f 73 65 71 75  d, "'sqlite_sequ
33e00 65 6e 63 65 27 22 29 20 29 7b 0a 20 20 20 20 20  ence'") ){.     
33e10 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
33e20 74 65 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45  te->out, "DELETE
33e30 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71   FROM sqlite_seq
33e40 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 20 20  uence;\n");.    
33e50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  }.    sqlite3_bi
33e60 6e 64 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 31  nd_int(pPages, 1
33e70 2c 20 69 52 6f 6f 74 29 3b 0a 20 20 20 20 73 71  , iRoot);.    sq
33e80 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
33e90 43 65 6c 6c 73 2c 20 32 2c 20 70 54 61 62 2d 3e  Cells, 2, pTab->
33ea0 69 50 6b 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65  iPk);..    while
33eb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33ec0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
33ed0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50 61 67  qlite3_step(pPag
33ee0 65 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  es) ){.      int
33ef0 20 69 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33   iPgno = sqlite3
33f00 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 61 67  _column_int(pPag
33f10 65 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  es, 0);.      sq
33f20 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
33f30 43 65 6c 6c 73 2c 20 31 2c 20 69 50 67 6e 6f 29  Cells, 1, iPgno)
33f40 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72  ;.      while( r
33f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33f60 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
33f70 74 65 33 5f 73 74 65 70 28 70 43 65 6c 6c 73 29  te3_step(pCells)
33f80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
33f90 6e 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65 33  nField = sqlite3
33fa0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c  _column_int(pCel
33fb0 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
33fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
33fd0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
33fe0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
33ff0 65 78 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a  ext(pCells, 1);.
34000 0a 20 20 20 20 20 20 20 20 6e 46 69 65 6c 64 20  .        nField 
34010 3d 20 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 20 20  = nField+1;.    
34020 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 4f      if( pTab==pO
34030 72 70 68 61 6e 20 29 7b 0a 20 20 20 20 20 20 20  rphan ){.       
34040 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
34050 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20 20  tate->out, .    
34060 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
34070 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53  T INTO %s VALUES
34080 28 25 64 2c 20 25 64 2c 20 25 64 2c 20 25 73 25  (%d, %d, %d, %s%
34090 73 25 73 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20  s%s);\n",.      
340a0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 51          pTab->zQ
340b0 75 6f 74 65 64 2c 20 69 52 6f 6f 74 2c 20 69 50  uoted, iRoot, iP
340c0 67 6e 6f 2c 20 6e 46 69 65 6c 64 2c 20 0a 20 20  gno, nField, .  
340d0 20 20 20 20 20 20 20 20 20 20 20 20 62 49 6e 74              bInt
340e0 6b 65 79 20 3f 20 22 22 20 3a 20 22 4e 55 4c 4c  key ? "" : "NULL
340f0 2c 20 22 2c 20 7a 56 61 6c 2c 20 70 54 61 62 2d  , ", zVal, pTab-
34100 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64 5d 0a  >azlCol[nField].
34110 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
34120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34130 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34140 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 49  (pState->out, "I
34150 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28 25 73  NSERT INTO %s(%s
34160 29 20 56 41 4c 55 45 53 28 20 25 73 20 29 3b 5c  ) VALUES( %s );\
34170 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
34180 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64     pTab->zQuoted
34190 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e  , pTab->azlCol[n
341a0 46 69 65 6c 64 5d 2c 20 7a 56 61 6c 0a 20 20 20  Field], zVal.   
341b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
341c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
341d0 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63    shellReset(&rc
341e0 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20 20 20 7d  , pCells);.    }
341f0 0a 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28  .    shellReset(
34200 26 72 63 2c 20 70 50 61 67 65 73 29 3b 0a 20 20  &rc, pPages);.  
34210 20 20 69 66 28 20 70 54 61 62 21 3d 70 4f 72 70    if( pTab!=pOrp
34220 68 61 6e 20 29 20 72 65 63 6f 76 65 72 46 72 65  han ) recoverFre
34230 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
34240 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  }.  shellFinaliz
34250 65 28 26 72 63 2c 20 70 4c 6f 6f 70 29 3b 0a 20  e(&rc, pLoop);. 
34260 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
34270 72 63 2c 20 70 50 61 67 65 73 29 3b 0a 20 20 73  rc, pPages);.  s
34280 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
34290 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20 72 65 63  , pCells);.  rec
342a0 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 70 4f  overFreeTable(pO
342b0 72 70 68 61 6e 29 3b 0a 0a 20 20 2f 2a 20 54 68  rphan);..  /* Th
342c0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 73 63  e rest of the sc
342d0 68 65 6d 61 20 2a 2f 0a 20 20 69 66 28 20 72 63  hema */.  if( rc
342e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
342f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
34300 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
34310 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74  shellPrepare(pSt
34320 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20  ate->db, &rc, . 
34330 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
34340 71 6c 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 72 65  ql, name FROM re
34350 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a  covery.schema ".
34360 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
34370 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27 63 72 65  ql NOT LIKE 'cre
34380 61 74 65 20 74 61 62 6c 65 25 27 22 2c 20 26 70  ate table%'", &p
34390 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
343a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
343b0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
343c0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
343d0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
343e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
343f0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
34400 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
34410 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
34420 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34430 33 5f 73 74 72 6e 69 63 6d 70 28 7a 53 71 6c 2c  3_strnicmp(zSql,
34440 20 22 63 72 65 61 74 65 20 76 69 72 74 22 2c 20   "create virt", 
34450 31 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  11)==0 ){.      
34460 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
34470 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
34480 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
34490 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
344a0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
344b0 7a 50 72 69 6e 74 20 3d 20 73 68 65 6c 6c 4d 50  zPrint = shellMP
344c0 72 69 6e 74 66 28 26 72 63 2c 20 0a 20 20 20 20  rintf(&rc, .    
344d0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
344e0 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
344f0 20 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c   VALUES('table',
34500 20 25 51 2c 20 25 51 2c 20 30 2c 20 25 51 29 22   %Q, %Q, 0, %Q)"
34510 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ,.          zNam
34520 65 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20  e, zName, zSql. 
34530 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
34540 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
34550 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e  ate->out, "%s;\n
34560 22 2c 20 7a 50 72 69 6e 74 29 3b 0a 20 20 20 20  ", zPrint);.    
34570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34580 28 7a 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20  (zPrint);.      
34590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
345a0 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
345b0 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
345c0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zSql);.      }. 
345d0 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
345e0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
345f0 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
34600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34610 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34620 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41  State->out, "PRA
34630 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
34640 65 6d 61 20 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a  ema = off;\n");.
34650 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34660 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d  State->out, "COM
34670 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  MIT;\n");.  }.  
34680 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 53 74  sqlite3_exec(pSt
34690 61 74 65 2d 3e 64 62 2c 20 22 44 45 54 41 43 48  ate->db, "DETACH
346a0 20 72 65 63 6f 76 65 72 79 22 2c 20 30 2c 20 30   recovery", 0, 0
346b0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
346c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  c;.}.#endif /* !
346d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
346e0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
346f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
34700 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29  BLE_DBPAGE_VTAB)
34710 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   */.../*.** If a
34720 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67  n input line beg
34730 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65  ins with "." the
34740 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  n invoke this ro
34750 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63  utine to.** proc
34760 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a  ess that line..*
34770 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
34780 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
34790 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
347a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
347b0 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  t do_meta_comman
347c0 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53  d(char *zLine, S
347d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
347e0 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e   int h = 1;.  in
347f0 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  t nArg = 0;.  in
34800 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63  t n, c;.  int rc
34810 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a   = 0;.  char *az
34820 41 72 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65  Arg[50];..#ifnde
34830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
34840 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
34850 20 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65   p->expert.pExpe
34860 72 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74  rt ){.    expert
34870 46 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b  Finish(p, 1, 0);
34880 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
34890 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
348a0 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65  t line into toke
348b0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ns..  */.  while
348c0 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41  ( zLine[h] && nA
348d0 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41  rg<ArraySize(azA
348e0 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  rg) ){.    while
348f0 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b  ( IsSpace(zLine[
34900 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20  h]) ){ h++; }.  
34910 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
34920 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
34930 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27  f( zLine[h]=='\'
34940 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27  ' || zLine[h]=='
34950 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  "' ){.      int 
34960 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b  delim = zLine[h+
34970 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b  +];.      azArg[
34980 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65  nArg++] = &zLine
34990 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  [h];.      while
349a0 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c  ( zLine[h] && zL
349b0 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b  ine[h]!=delim ){
349c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69  .        if( zLi
349d0 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64  ne[h]=='\\' && d
349e0 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69  elim=='"' && zLi
349f0 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b  ne[h+1]!=0 ) h++
34a00 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20  ;.        h++;. 
34a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34a20 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d   zLine[h]==delim
34a30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
34a40 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
34a50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
34a60 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c  lim=='"' ) resol
34a70 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
34a80 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
34a90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34aa0 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
34ab0 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
34ac0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
34ad0 20 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69   && !IsSpace(zLi
34ae0 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
34af0 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
34b00 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  [h] ) zLine[h++]
34b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f   = 0;.      reso
34b20 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
34b30 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a  azArg[nArg-1]);.
34b40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34b50 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75  Process the inpu
34b60 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  t line..  */.  i
34b70 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74  f( nArg==0 ) ret
34b80 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b  urn 0; /* no tok
34b90 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f  ens, no error */
34ba0 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
34bb0 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d  azArg[0]);.  c =
34bc0 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20   azArg[0][0];.  
34bd0 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29  clearTempFile(p)
34be0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
34bf0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
34c00 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61  TION.  if( c=='a
34c10 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
34c20 72 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e  rg[0], "auth", n
34c30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
34c40 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
34c50 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34c60 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74  rr, "Usage: .aut
34c70 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20  h ON|OFF\n");.  
34c80 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34c90 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
34ca0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
34cb0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
34cc0 29 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  );.    if( boole
34cd0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
34ce0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
34cf0 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
34d00 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75  r(p->db, shellAu
34d10 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  th, p);.    }els
34d20 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
34d30 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
34d40 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
34d50 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
34d60 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
34d70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
34d80 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
34d90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
34da0 45 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d  E_ZLIB).  if( c=
34db0 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
34dc0 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69  azArg[0], "archi
34dd0 76 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ve", n)==0 ){.  
34de0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
34df0 0a 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43  .    rc = arDotC
34e00 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41  ommand(p, 0, azA
34e10 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
34e20 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
34e30 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33   (c=='b' && n>=3
34e40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
34e50 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20  g[0], "backup", 
34e60 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d  n)==0).   || (c=
34e70 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='s' && n>=3 && 
34e80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
34e90 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29  , "save", n)==0)
34ea0 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
34eb0 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20  char *zDestFile 
34ec0 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
34ed0 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
34ee0 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74    sqlite3 *pDest
34ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
34f00 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
34f10 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
34f20 74 20 62 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20  t bAsync = 0;.  
34f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
34f40 66 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  fs = 0;.    for(
34f50 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  j=1; j<nArg; j++
34f60 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
34f70 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a  har *z = azArg[j
34f80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30  ];.      if( z[0
34f90 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
34fa0 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
34fb0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
34fc0 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61  f( strcmp(z, "-a
34fd0 70 70 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ppend")==0 ){.  
34fe0 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22          zVfs = "
34ff0 61 70 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20  apndvfs";.      
35000 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
35010 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
35020 61 73 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20  async")==0 ){.  
35030 20 20 20 20 20 20 20 20 62 41 73 79 6e 63 20 3d          bAsync =
35040 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
35050 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
35060 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35070 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
35080 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  wn option: %s\n"
35090 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  , azArg[j]);.   
350a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
350b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
350c0 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74   }else if( zDest
350d0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
350e0 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
350f0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
35100 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20  else if( zDb==0 
35110 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  ){.        zDb =
35120 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20   zDestFile;.    
35130 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
35140 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
35150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
35160 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
35170 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 63 6b 75  , "Usage: .backu
35180 70 20 3f 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f  p ?DB? ?OPTIONS?
35190 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20   FILENAME\n");. 
351a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
351b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
351c0 20 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65     if( zDestFile
351d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
351e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
351f0 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d  "missing FILENAM
35200 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62  E argument on .b
35210 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20  ackup\n");.     
35220 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
35230 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
35240 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  ) zDb = "main";.
35250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35260 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74 46 69  _open_v2(zDestFi
35270 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a 20 20 20  le, &pDest, .   
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
35290 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
352a0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
352b0 5f 43 52 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a  _CREATE, zVfs);.
352c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
352d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
352e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
352f0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
35300 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
35310 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
35320 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65      close_db(pDe
35330 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
35340 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
35350 66 28 20 62 41 73 79 6e 63 20 29 7b 0a 20 20 20  f( bAsync ){.   
35360 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
35370 70 44 65 73 74 2c 20 22 50 52 41 47 4d 41 20 73  pDest, "PRAGMA s
35380 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20  ynchronous=OFF; 
35390 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
353a0 6f 64 65 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20  ode=OFF;",.     
353b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
353c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
353d0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
353e0 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
353f0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
35400 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
35410 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20  , p->db, zDb);. 
35420 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
35430 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
35440 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35450 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
35460 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
35470 73 74 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  st));.      clos
35480 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20  e_db(pDest);.   
35490 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
354a0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
354b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
354c0 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
354d0 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
354e0 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
354f0 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
35500 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
35510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
35520 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
35530 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
35540 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35550 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
35560 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
35570 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
35580 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
35590 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28   }.    close_db(
355a0 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
355b0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
355c0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
355d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c  (azArg[0], "bail
355e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
355f0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
35600 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72       bail_on_err
35610 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
35620 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
35630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
35640 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35650 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f   "Usage: .bail o
35660 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
35670 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
35680 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
35690 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
356a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
356b0 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d  , "binary", n)==
356c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
356d0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g==2 ){.      if
356e0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
356f0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
35700 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
35710 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
35720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35730 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
35740 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
35750 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
35760 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35770 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
35780 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22  binary on|off\n"
35790 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
357a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
357b0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
357c0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  strcmp(azArg[0],
357d0 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "cd")==0 ){.    
357e0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23  if( nArg==2 ){.#
357f0 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
35800 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
35810 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72  N32).      wchar
35820 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
35830 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
35840 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b  icode(azArg[1]);
35850 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74  .      rc = !Set
35860 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79  CurrentDirectory
35870 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  W(z);.      sqli
35880 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  te3_free(z);.#el
35890 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68  se.      rc = ch
358a0 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  dir(azArg[1]);.#
358b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
358c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
358d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
358e0 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65  , "Cannot change
358f0 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22   to directory \"
35900 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
35910 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
35920 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
35930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
35940 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35950 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45  "Usage: .cd DIRE
35960 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20  CTORY\n");.     
35970 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
35980 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
35990 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e   undocumented ".
359a0 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d  breakpoint" comm
359b0 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c  and causes a cal
359c0 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20  l to the no-op. 
359d0 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65   ** routine name
359e0 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
359f0 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  t()..  */.  if( 
35a00 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
35a10 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35a20 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22  0], "breakpoint"
35a30 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  , n)==0 ){.    t
35a40 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
35a50 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
35a60 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
35a70 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
35a80 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20  [0], "changes", 
35a90 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
35aa0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
35ab0 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67    setOrClearFlag
35ac0 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43  (p, SHFLG_CountC
35ad0 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d  hanges, azArg[1]
35ae0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35af0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35b00 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
35b10 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e  changes on|off\n
35b20 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
35b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
35b40 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74  .  /* Cancel out
35b50 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c  put redirection,
35b60 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   if it is curren
35b70 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73  tly set (by .tes
35b80 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e  tcase).  ** Then
35b90 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
35ba0 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73  t of the testcas
35bb0 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61  e-out.txt file a
35bc0 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  nd compare again
35bd0 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d  st.  ** azArg[1]
35be0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
35bf0 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70  differences, rep
35c00 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  ort an error and
35c10 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   exit..  */.  if
35c20 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
35c30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35c40 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e  g[0], "check", n
35c50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
35c60 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *zRes = 0;.    
35c70 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
35c80 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
35c90 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
35ca0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
35cb0 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42  age: .check GLOB
35cc0 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20  -PATTERN\n");.  
35cd0 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
35ce0 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20  }else if( (zRes 
35cf0 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74  = readFile("test
35d00 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30  case-out.txt", 0
35d10 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))==0 ){.      r
35d20 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
35d30 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
35d40 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d   read 'testcase-
35d50 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20  out.txt'\n");.  
35d60 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
35d70 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61  }else if( testca
35d80 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d  se_glob(azArg[1]
35d90 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zRes)==0 ){.   
35da0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
35db0 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
35dc0 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73          "testcas
35dd0 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78  e-%s FAILED\n Ex
35de0 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20  pected: [%s]\n  
35df0 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22      Got: [%s]\n"
35e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35e10 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c     p->zTestcase,
35e20 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29   azArg[1], zRes)
35e30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
35e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35e50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35e60 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25  out, "testcase-%
35e70 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73  s ok\n", p->zTes
35e80 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d  tcase);.      p-
35e90 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d  >nCheck++;.    }
35ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
35eb0 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65  e(zRes);.  }else
35ec0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
35ed0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35ee0 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d  0], "clone", n)=
35ef0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
35f00 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74  rg==2 ){.      t
35f10 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41  ryToClone(p, azA
35f20 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
35f30 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
35f40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35f50 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e  ge: .clone FILEN
35f60 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
35f70 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
35f80 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
35f90 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
35fa0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
35fb0 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
35fc0 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74  0 ){.    ShellSt
35fd0 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
35fe0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
35ff0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
36000 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
36010 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
36020 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
36030 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
36040 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
36050 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
36060 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  DE_List;.    sql
36070 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
36080 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70  zeof(data.colSep
36090 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c  arator),data.col
360a0 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b  Separator,": ");
360b0 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20  .    data.cnt = 
360c0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
360d0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
360e0 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52  CT name, file FR
360f0 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61  OM pragma_databa
36100 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20  se_list",.      
36110 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
36120 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
36130 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
36140 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
36150 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36160 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
36170 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
36180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
36190 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
361a0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
361b0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
361c0 64 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  d' && n>=3 && st
361d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
361e0 22 64 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d  "dbconfig", n)==
361f0 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
36200 63 6f 6e 73 74 20 73 74 72 75 63 74 20 44 62 43  const struct DbC
36210 6f 6e 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20  onfigChoices {. 
36220 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36230 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  *zName;.      in
36240 74 20 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43  t op;.    } aDbC
36250 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  onfig[] = {.    
36260 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b      { "enable_fk
36270 65 79 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  ey",        SQLI
36280 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
36290 4c 45 5f 46 4b 45 59 20 20 20 20 20 20 20 20 20  LE_FKEY         
362a0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
362b0 65 6e 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c  enable_trigger",
362c0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
362d0 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
362e0 47 45 52 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  GER        },.  
362f0 20 20 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f        { "fts3_to
36300 6b 65 6e 69 7a 65 72 22 2c 20 20 20 20 20 53 51  kenizer",     SQ
36310 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
36320 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
36330 5a 45 52 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ZER },.        {
36340 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e   "load_extension
36350 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ",     SQLITE_DB
36360 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f  CONFIG_ENABLE_LO
36370 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a  AD_EXTENSION },.
36380 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63 6b          { "no_ck
36390 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 20 20  pt_on_close",   
363a0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
363b0 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
363c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
363d0 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22   { "enable_qpsg"
363e0 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
363f0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
36400 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20 7d  QPSG           }
36410 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69  ,.        { "tri
36420 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20  gger_eqp",      
36430 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
36440 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20  G_TRIGGER_EQP   
36450 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36460 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61     { "reset_data
36470 62 61 73 65 22 2c 20 20 20 20 20 53 51 4c 49 54  base",     SQLIT
36480 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54  E_DBCONFIG_RESET
36490 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
364a0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64   },.        { "d
364b0 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20  efensive",      
364c0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
364d0 46 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20  FIG_DEFENSIVE   
364e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
364f0 20 20 20 20 20 7b 20 22 77 72 69 61 62 6c 65 5f       { "wriable_
36500 73 63 68 65 6d 61 22 2c 20 20 20 20 20 53 51 4c  schema",     SQL
36510 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
36520 54 41 42 4c 45 5f 53 43 48 45 4d 41 20 20 20 20  TABLE_SCHEMA    
36530 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
36540 22 6c 65 67 61 63 79 5f 61 6c 74 65 72 5f 74 61  "legacy_alter_ta
36550 62 6c 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43  ble", SQLITE_DBC
36560 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54  ONFIG_LEGACY_ALT
36570 45 52 5f 54 41 42 4c 45 20 20 20 20 7d 2c 0a 20  ER_TABLE    },. 
36580 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 64 71 73         { "no_dqs
36590 5f 73 63 68 65 6d 61 22 2c 20 20 20 20 20 20 53  _schema",      S
365a0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
365b0 4f 5f 44 51 53 5f 53 43 48 45 4d 41 20 20 20 20  O_DQS_SCHEMA    
365c0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
365d0 7b 20 22 6e 6f 5f 64 71 73 22 2c 20 20 20 20 20  { "no_dqs",     
365e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
365f0 42 43 4f 4e 46 49 47 5f 4e 4f 5f 44 51 53 20 20  BCONFIG_NO_DQS  
36600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
36610 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
36620 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f  ii, v;.    open_
36630 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f  db(p, 0);.    fo
36640 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79  r(ii=0; ii<Array
36650 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b  Size(aDbConfig);
36660 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
36670 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63  ( nArg>1 && strc
36680 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62  mp(azArg[1], aDb
36690 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
366a0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
366b0 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
366c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
366d0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
366e0 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
366f0 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e  [ii].op, boolean
36700 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c  Value(azArg[2]),
36710 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
36720 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
36730 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43  nfig(p->db, aDbC
36740 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31  onfig[ii].op, -1
36750 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66  , &v);.      utf
36760 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36770 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44   "%18s %s\n", aD
36780 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
36790 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  e, v ? "on" : "o
367a0 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff");.      if( 
367b0 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a  nArg>1 ) break;.
367c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
367d0 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61  rg>1 && ii==Arra
367e0 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
367f0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
36800 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
36810 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62  rror: unknown db
36820 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22  config \"%s\"\n"
36830 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
36840 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36850 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22  tderr, "Enter \"
36860 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68  .dbconfig\" with
36870 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
36880 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20  r a list\n");.  
36890 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a    }   .  }else..
368a0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
368b0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
368c0 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
368d0 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
368e0 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
368f0 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
36900 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
36910 6c 73 65 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  lse..#if !define
36920 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
36930 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
36940 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
36950 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
36960 29 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  ).  if( c=='r' &
36970 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36980 30 5d 2c 20 22 72 65 63 6f 76 65 72 22 2c 20 6e  0], "recover", n
36990 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
369a0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
369b0 63 20 3d 20 72 65 63 6f 76 65 72 44 61 74 61 62  c = recoverDatab
369c0 61 73 65 43 6d 64 28 70 2c 20 6e 41 72 67 2c 20  aseCmd(p, nArg, 
369d0 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
369e0 23 65 6e 64 69 66 20 2f 2a 20 21 28 53 51 4c 49  #endif /* !(SQLI
369f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
36a00 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
36a10 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44  (SQLITE_ENABLE_D
36a20 42 50 41 47 45 5f 56 54 41 42 29 20 2a 2f 0a 0a  BPAGE_VTAB) */..
36a30 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
36a40 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36a50 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
36a60 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
36a70 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20  r *zLike = 0;.  
36a80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
36a90 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
36aa0 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
36ab0 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53  ;.    int savedS
36ac0 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  hellFlags = p->s
36ad0 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68  hellFlgs;.    Sh
36ae0 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  ellClearFlag(p, 
36af0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
36b00 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  wid|SHFLG_Newlin
36b10 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a  es|SHFLG_Echo);.
36b20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
36b30 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
36b40 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d   if( azArg[i][0]
36b50 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
36b60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
36b70 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20   azArg[i]+1;.   
36b80 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
36b90 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
36ba0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
36bb0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22  preserve-rowids"
36bc0 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
36bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36be0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
36bf0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36c00 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73  err, "The --pres
36c10 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69  erve-rowids opti
36c20 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  on is not compat
36c30 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  ible".          
36c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c50 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45     " with SQLITE
36c60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36c70 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
36c80 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36c90 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36ca0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73  mmand_exit;.#els
36cb0 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  e.          Shel
36cc0 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
36cd0 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
36ce0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
36cf0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
36d00 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77  f( strcmp(z,"new
36d10 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  lines")==0 ){.  
36d20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74          ShellSet
36d30 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
36d40 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20  wlines);.       
36d50 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
36d60 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
36d70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
36d80 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
36d90 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c  %s\" on \".dump\
36da0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "\n", azArg[i]);
36db0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
36dc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
36dd0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
36de0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
36df0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
36e00 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
36e10 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36e20 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70  r, "Usage: .dump
36e30 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77   ?--preserve-row
36e40 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20  ids? ".         
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e60 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20    "?--newlines? 
36e70 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
36e80 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
36e90 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
36ea0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36eb0 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
36ec0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
36ed0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
36ee0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 70   }.    }..    op
36ef0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20 20  en_db(p, 0);..  
36f00 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
36f10 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c  g back a "dump",
36f20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67   the content mig
36f30 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20  ht appear in an 
36f40 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69  order.    ** whi
36f50 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69  ch causes immedi
36f60 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
36f70 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62  constraints to b
36f80 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20  e violated..    
36f90 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f  ** So disable fo
36fa0 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72  reign-key constr
36fb0 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  aint enforcement
36fc0 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62   to prevent prob
36fd0 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77  lems. */.    raw
36fe0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
36ff0 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
37000 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  keys=OFF;\n");. 
37010 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
37020 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41  >out, "BEGIN TRA
37030 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20  NSACTION;\n");. 
37040 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
37050 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d  hema = 0;.    p-
37060 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  >showHeader = 0;
37070 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74  .    /* Set writ
37080 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73  able_schema=ON s
37090 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f  ince doing so fo
370a0 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69  rces SQLite to i
370b0 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a  nitialize.    **
370c0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20   as much of the 
370d0 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e  schema as it can
370e0 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c   even if the sql
370f0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
37100 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75   is.    ** corru
37110 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pt. */.    sqlit
37120 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
37130 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20  SAVEPOINT dump; 
37140 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
37150 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30  schema=ON", 0, 0
37160 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72  , 0);.    p->nEr
37170 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  r = 0;.    if( z
37180 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Like==0 ){.     
37190 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
371a0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
371b0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
371c0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
371d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
371e0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
371f0 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
37200 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44  ype=='table' AND
37210 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
37220 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
37230 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
37240 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
37250 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
37260 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
37270 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
37280 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
37290 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
372a0 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
372b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
372c0 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
372d0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
372e0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
372f0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
37300 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
37310 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
37320 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
37330 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
37340 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
37350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37360 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
37370 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
37380 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
37390 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
373a0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
373b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
373c0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
373d0 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41  l_name LIKE %Q A
373e0 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
373f0 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
37400 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
37410 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
37420 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
37430 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20  ery(p,zSql);.   
37440 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
37450 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71  zSql);.      zSq
37460 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
37470 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
37480 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
37490 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
374a0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
374b0 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20   NOT NULL".     
374c0 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49     "  AND type I
374d0 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
374e0 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ger','view')".  
374f0 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
37500 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20  _name LIKE %Q", 
37510 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
37520 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
37530 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  ry(p, zSql, 0);.
37540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
37550 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
37560 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
37570 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
37580 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
37590 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
375a0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
375b0 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d  F;\n");.      p-
375c0 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
375d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
375e0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
375f0 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
37600 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
37610 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
37620 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
37630 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d  db, "RELEASE dum
37640 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  p;", 0, 0, 0);. 
37650 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
37660 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 3f 22 52  >out, p->nErr?"R
37670 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20  OLLBACK; -- due 
37680 74 6f 20 65 72 72 6f 72 73 5c 6e 22 3a 22 43 4f  to errors\n":"CO
37690 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  MMIT;\n");.    p
376a0 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73  ->showHeader = s
376b0 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a  avedShowHeader;.
376c0 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73      p->shellFlgs
376d0 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61   = savedShellFla
376e0 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  gs;.  }else..  i
376f0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
37700 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
37710 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  echo", n)==0 ){.
37720 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
37730 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
37740 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
37750 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29  _Echo, azArg[1])
37760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37770 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
37780 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
37790 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  cho on|off\n");.
377a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
377b0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
377c0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
377d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
377e0 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eqp", n)==0 ){. 
377f0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
37800 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  {.      p->autoE
37810 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  QPtest = 0;.    
37820 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51 50    if( p->autoEQP
37830 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
37840 20 69 66 28 20 70 2d 3e 64 62 20 29 20 73 71 6c   if( p->db ) sql
37850 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
37860 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72   "PRAGMA vdbe_tr
37870 61 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c  ace=OFF;", 0, 0,
37880 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   0);.        p->
37890 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20 30  autoEQPtrace = 0
378a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
378b0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
378c0 5b 31 5d 2c 22 66 75 6c